challenge バイナリクロック

 時刻を二進数相当の表現で出力する時計アプリケーションを書いてください。
 20:18の場合,例えば以下の様な出力をするイメージです。

出力例:
 ■□■□□
□■□□■□
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! c:\ruby\bin\ruby.exe -Ks

String.class_eval do |string|
    def words
        self.split(//)
    end
    def fix_width(width, padding)
        (self.words.size > width) ? self : (padding * (width - self.words.size) + self)
    end
end

Fixnum.class_eval do |fixnum|
    alias :to_s_orig :to_s
    def to_s(base, width)
        binary = self.to_s_orig(base).fix_width(width, "0")
    end
end

class BinaryClock
    attr_accessor :now
    def initialize
        self.now = Time.now
    end
    def print
        output(self.now.hour.to_s(2, 5))
        output(self.now.min.to_s(2, 6))
    end
private
    def output(binary)
        puts binary.words.map { |f| f == "0" ? "□" : "■" }.join.fix_width(6, " ")
    end
end

BinaryClock.new.print

Posted feedbacks - Perl

年月日時分秒 まで表示してみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use strict;
use warnings;

# Binary clock

$\="\n";
$,=":";
clear_screen();
while ( 1 )
{
  my ($sec,$min,$hour,$day,$month,$year)=localtime;
  ++$month;
  $year+=1900;
  print bin_($year,'年', 12), sprintf('%4d',$year);
  print bin_($month,'月', 5), sprintf('%4d',$month);
  print bin_($day,'日', 6)  , sprintf('%4d',$day);
  print bin_($hour,'時', 6) , sprintf('%4d',$hour);
  print bin_($min,'分', 7)  , sprintf('%4d',$min);
  print bin_($sec,'秒', 7)  , sprintf('%4d',$sec);
  sleep 1;
  clear_screen();
}

sub bin_
{
  my ($n,$s,$m) = @_;

  '_'x(12-$m) . join '', map { ((1 <<($_-1)) & $n) ? $s : '□' } reverse 1 .. $m;
}

sub clear_screen
{
  if ( $^O =~ /Win32/ ) {
    system('cls');
  }
  else {
    if (system('clear') != 0) {
      print "\x1b[2J";
    }
  }
}

一行野郎。本体73bytes、全部で114bytes。 マルチバイトでなければ-Mスイッチはなくていいです。

1
perl -Mutf8 -Mopen=:utf8 -Mopen=:std -E'say for map { $_ = sprintf "%06b", $_; tr/01/□■/; $_ } (localtime)[2, 1];'

少し短くかつPerl 5.8.xでも動くようにしました。-CIOがポイント。

Dan the Perl Monger

1
perl -CIO -Mutf8 -le 'print for map { $_ = sprintf "%06b", $_; tr/01/□■/; $_ } (localtime)[2,1];'

Index

Feed

Other

Link

Pathtraq

loading...