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 - C

シンプルに、特に目立った点はないです。
 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
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<time.h>

int main(void)
{
    time_t Time;
    struct tm *t;
    int hour, min, i, 
        hstr[6], mstr[7];

//現在時刻の取得
    
    Time = time(&Time);
    t = localtime(&Time);
    hour = t->tm_hour;
    min = t->tm_min;
    
//2進数に変換して表示
    
    i = 0;
    while(hour)
    {
        hstr[i++] = hour % 2 ? 1 : 0;
        hour /= 2;
    }
    for( ; i < 5; i++)    hstr[i] = 0;
    
    for(i -= 1; i >= 0; i--)
    {
        hstr[i] ? printf("■") : printf("□");
    }
    
    putchar('\n');
    
    i = 0;
    while(min)
    {
        mstr[i++] = min % 2 ? 1 : 0;
        min /= 2;
    }
    for( ; i < 6; i++)    mstr[i] = 0;
    
    for(i -= 1; i >= 0; i--)
    {
        mstr[i] ? printf("■") : printf("□");
    }
    
    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...