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

ごくシンプルに。

 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
import java.util.Calendar;
import java.util.GregorianCalendar;

public class BinaryClock {
    public static void main( String[] args ) {
        // 現在時刻を取得する。
        Calendar cal = new GregorianCalendar();

        // 現在時刻から時・分を取得する。
        int hour = cal.get( Calendar.HOUR_OF_DAY );
        int min = cal.get( Calendar.MINUTE );

        // 時・分を二進数に変換する。
        String binHour = Integer.toString( hour, 2 );
        String binMin = Integer.toString( min, 2 );

        // 二進数を表示用文字列に変換する。
        String dispStrHour = binToDispStr( binHour );
        String dispStrMin = binToDispStr( binMin );
        
        // 表示用文字列を出力する。
        System.out.println( dispStrHour );
        System.out.println( dispStrMin );
    }
    
    // 二進数を表示用文字列に変換する。
    private static String binToDispStr( String bin ) {
        String bak = "";
        for ( int i = 0; i < bin.length(); ++i ) {
            if ( bin.charAt( i ) == '0' ) {
                bak += "□";
            } else {
                bak += "■";
            }
        }
        return bak;
    }
}

先に投稿した#9342を一部変更。

二進数を表示文字列に変換する処理(binToDispStrメソッド)を、文字列置換による実装に変更した。

 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
import java.util.Calendar;
import java.util.GregorianCalendar;

public class BinaryClock2 {
    public static void main( String[] args ) {
        // 現在時刻を取得する。
        Calendar cal = new GregorianCalendar();

        // 現在時刻から時・分を取得する。
        int hour = cal.get( Calendar.HOUR_OF_DAY );
        int min = cal.get( Calendar.MINUTE );

        // 時・分を二進数に変換する。
        String binHour = Integer.toString( hour, 2 );
        String binMin = Integer.toString( min, 2 );

        // 二進数を表示用文字列に変換する。
        String dispStrHour = binToDispStr( binHour );
        String dispStrMin = binToDispStr( binMin );
        
        // 表示用文字列を出力する。
        System.out.println( dispStrHour );
        System.out.println( dispStrMin );
    }
    
    // 二進数を表示用文字列に変換する。
    // ※文字列置換による実装
    private static String binToDispStr( String bin ) {
        return bin.replaceAll( "0", "□" )
                    .replaceAll( "1", "■" );
    }
}

お題から少しずれますが、元ネタがウィジェットだそうなので、Java Swing です。
フォントによってしまいますが、見た目が面白いものとして"i/!"にしました。
"Q/O"でも分かりにくくて良いですね。
 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
50
51
52
53
54
55
56
57
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class SeventeenBarsClock extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                SeventeenBarsClock clock = new SeventeenBarsClock();
                clock.pack();
                clock.setLocationRelativeTo(null);
                clock.setVisible(true);
                clock.start();
            }
        });
    }
    private BynaryLabel hourLabel, minuteLabel, secondLabel;
    private javax.swing.Timer timer;
    SeventeenBarsClock() {
        super("17BarsClock");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        hourLabel = new BynaryLabel(5);
        minuteLabel = new BynaryLabel(6);
        secondLabel = new BynaryLabel(6);
        setLayout(new FlowLayout());
        add(hourLabel);
        add(minuteLabel);
        add(secondLabel);
        timer = new javax.swing.Timer(0, this);
        timer.setDelay(1000);
    }
    public void start() { timer.start(); }
    public void stop() { timer.stop(); }
    @Override
    public void actionPerformed(ActionEvent e) {
        Calendar cal = new GregorianCalendar();
        hourLabel.setValue(cal.get(Calendar.HOUR_OF_DAY));
        minuteLabel.setValue(cal.get(Calendar.MINUTE));
        secondLabel.setValue(cal.get(Calendar.SECOND));
    }
    private static class BynaryLabel extends JLabel {
        private static final long serialVersionUID = 1L;
        BynaryLabel(int length) {
            this.length = length;
            setValue(0);
        }
        private int length;
        void setValue(int value) {
            StringBuilder sb = new StringBuilder(length);
            for(int m=1<<(length-1); m>0; m>>=1) sb.append((value & m) != 0 ? "i" : "!");
            setText(sb.toString());
        }
    }
}

Index

Feed

Other

Link

Pathtraq

loading...