こどもてるびぃ

 | 

2006-05-27

[]Q2

LCD Numbers - bongoleのRubyを楽しむ日記 - Rubyist

require 'optparse'

DIGITS = [<<ZERO, <<ONE, <<TWO, <<THREE, <<FOUR, <<FIVE, <<SIX, <<SEVEN, <<EIGHT, <<NINE]
 -
| |

| |
 -
ZERO

  |

  |

ONE
 -
  |
 -
|
 -
TWO
 -
  |
 -
  |
 -
THREE

| |
 -
  |

FOUR
 -
|
 -
  |
 -
FIVE
 -
|
 -
| |
 -
SIX
 -
  |

  |

SEVEN
 -
| |
 -
| |
 -
EIGHT
 -
| |
 -
  |
 -
NINE

def digits(str, size)
  index = -1
  nums = str.split('').map {|n| DIGITS[n.to_i].split("\n") }
  nums.shift.zip(*nums).map {|lines|
    lines.map {|line|
      line[0, 1] + line[1, 1] * size + line[2, 1]
    }.join(' ' * size)
  }.inject([]) {|result, line|
    ((index = index.succ) % 2 == 0 ? 1 : size).times { result << line }
    result
  }.join("\n")
end


size = 2
ARGV.options do |opt|
  opt.on('-s [VAL]') {|v| size = v.to_i }
  opt.parse!
end
puts digits(ARGV.shift, size)

上のページでオプション処理とヒアドキュメントについて調べて、後は思いつくまま。

  • DIGITS の書き方が冗長
  • '++' ないの?
  • push の代わりに << を使うことを覚えた
  • prototype.js みたいにイテレータ全部で index を渡してくれればいいのに
 |