『ルビークイズ』のクイズ2の解答


私のこの解法書には入っていないので、貼ってください.

module LCD

  SCREEN=[
        [0,1,3,4,5,6], # 0 LCD
        [3,6], # 1 LCD
        [0,2,3,4,5], # 2 LCD
        [0,2,3,5,6], # 3 LCD
        [1,2,3,6], # 4 LCD
        [0,1,2,5,6], # 5 LCD
        [0,1,2,4,5,6], # 6 LCD
        [0,3,6], # 7 LCD
        [0,1,2,3,4,5,6], # 1 LCD
        [0,1,2,3,6] # 1 LCD
       ]

  CHARS=["_","|", "_", "|", "|", "_", "|"]

  FILL=[lambda{ |size| Array.new(size){ |i| [0,1+i]}}, # 0
        lambda{ |size| Array.new(size){ |i| [1+i,0] }}, # 1
        lambda{ |size| Array.new(size){ |i| [size,1+i] }}, # 2
        lambda{ |size| Array.new(size){ |i| [1+i,size+1] }}, # 3
        lambda{ |size| Array.new(size){ |i| [size+1+i,0] }}, # 4
        lambda{ |size| Array.new(size){ |i| [2*size,1+i] }}, # 5
        lambda{ |size| Array.new(size){ |i| [size+1+i, size+1] }}, # 6
       ]

  def init_array(size)
    ret = Array.new(3+size*2){ Array.new(3+size){ ' '}}
  end

  def lcd_single(num, size=1)
    "
"+join(fill(init_array(size), SCREEN[num],size)) end def lcd(num, size=1) data = [] num.to_s.each_byte do |c| data.push(fill(init_array(size), SCREEN[c.chr.to_i],size)) end join(sum(data)) end def sum(data) data.inject do |sum, item| sum.each_index do |index| sum[index] = sum[index] + item[index] end end end def fill(data,screen,size) screen.each do |item| FILL[item].call(size).each do |row,col| data[row][col]=CHARS[item] end end data end def join(data) data.map{ |row| row.join}.join("
") end end