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

pythonで素直に。timezoneの設定は、サマータイムがない国にとっては面倒なだけです。

 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
#!/usr/bin/python
#coding: utf-8

import datetime

# 横の文字数
cols = 6

# datatimeでJSTを使用する
class tz_jst(datetime.tzinfo):
  def utcoffset(self, dt):
    return datetime.timedelta(hours=9)
  def dst(self, dt):
    return datetime.timedelta()
  def tzname(self):
    return 'JST'

# n: 表示する数字, digits: 表示する桁数, cols: 横の文字数
# one: 1のときに表示する文字, zero: 0のときに表示する文字, padding: paddingに使用する文字
def print_bin(n, digits, cols, one='■', zero='□', padding=' '):
  s = ''
  if cols > digits: s += padding * (cols - digits)

  powers = [2**i for i in range(digits)]
  powers.reverse()
  # オーバーフロー分を切り捨てる
  n = n % 2**digits
  for x in powers:
    s += one if n / x else zero
    n %= x
  print s  

dt = datetime.datetime.now(tz_jst())
print_bin(dt.hour, 5, cols)
print_bin(dt.minute, 6, cols)

Index

Feed

Other

Link

Pathtraq

loading...