Ruby Quiz: LCD

勉強会の題材で、Ruby Quizを取り上げているのですが、わたしの拙いプログラムを、皆様の御参考に公開してみようと思います。 最初は、LCD Numbersです。コマンドライン引数として渡された数字を、電卓の液晶画面のように表示するのが課題。サイズ指定も出来ることが条件です。 本来の出題意図は、空白  と - マイナスと | で数字を表現するらしいのですが、通常のターミナルではあまり数字らしく見えなかったので、 - の代わりに _ を使ってみました。

require 'optparse'

class Digit
  @@digits = Array.new
  @@digits[0] = [[" ", "_", " "],
                 ["|", " ", "|"],
                 ["|", "_", "|"]]
  @@digits[1] = [[" ", " ", " "],
                 [" ", " ", "|"],
                 [" ", " ", "|"]]
  @@digits[2] = [[" ", "_", " "],
                 [" ", "_", "|"],
                 ["|", "_", " "]]
  @@digits[3] = [[" ", "_", " "],
                 [" ", "_", "|"],
                 [" ", "_", "|"]]
  @@digits[4] = [[" ", " ", " "],
                 ["|", "_", "|"],
                 [" ", " ", "|"]]
  @@digits[5] = [[" ", "_", " "],
                 ["|", "_", " "],
                 [" ", "_", "|"]]
  @@digits[6] = [[" ", "_", " "],
                 ["|", "_", " "],
                 ["|", "_", "|"]]
  @@digits[7] = [[" ", "_", " "],
                 [" ", " ", "|"],
                 [" ", " ", "|"]]
  @@digits[8] = [[" ", "_", " "],
                 ["|", "_", "|"],
                 ["|", "_", "|"]]
  @@digits[9] = [[" ", "_", " "],
                 ["|", "_", "|"],
                 [" ", "_", "|"]]


  def initialize(size)
    @size = size
  end

  def row(n,row_num)
    case row_num
    when 0
      " " + @@digits[n][0][0] + @@digits[n][0][1] * @size 
          + @@digits[n][0][2]
    when Range.new(0,@size,true)
      " " + @@digits[n][1][0] + ' ' * @size 
          + @@digits[n][1][2]
    when @size
      " " + @@digits[n][1][0] + @@digits[n][1][1] * @size 
          + @@digits[n][1][2]
    when Range.new(@size,@size * 2,true)
      " " + @@digits[n][2][0] + ' ' * @size 
          + @@digits[n][2][2]
    when @size * 2
      " " + @@digits[n][2][0] + @@digits[n][2][1] * @size 
          + @@digits[n][2][2]
    else
      raise "Error"
    end
  end
end

size = 2
opt = OptionParser.new
opt.on('-s SIZE') {|v| size = v.to_i}

opt.parse!(ARGV)
number = ARGV[0]
out_digits = []
d = Digit.new(size)

0.upto(size * 2) do |i|
  line = ""
  number.each_byte {|c| line += d.row(c.chr.to_i, i)}
  puts line
end
</pre>

Published on 2007/04/30 at 15:47 by いたさん, tags , ,

comment Ruby Quiz: LCD

Powered by Publify | Photo Startup stock photos