From: lucsky@... (Luc Heinrich) Date: 2005-01-10T00:31:24+09:00 Subject: Re: [QUIZ] LCD Numbers (#14) Luc Heinrich wrote: > Here's my solution: Woops, found a bug: displaying the same digit multiple times wasn't working, so doing 'lcd.rb 55' for example would render garbage. Here's my fixed (and slightly updated) solution: **************************** [begin code ] **************************** #!/usr/local/bin/ruby -w require 'getoptlong' # ---------------------------------------------------------------------- class Array def deep_clone Marshal::load(Marshal.dump(self)) end end # ---------------------------------------------------------------------- class Digit S = " " H = "-" V = "|" @@segments = [ [ [S,H,S], [V,S,V], [S,S,S], [V,S,V], [S,H,S] ], # 0 [ [S,S,S], [S,S,V], [S,S,S], [S,S,V], [S,S,S] ], # 1 [ [S,H,S], [S,S,V], [S,H,S], [V,S,S], [S,H,S] ], # 2 [ [S,H,S], [S,S,V], [S,H,S], [S,S,V], [S,H,S] ], # 3 [ [S,S,S], [V,S,V], [S,H,S], [S,S,V], [S,S,S] ], # 4 [ [S,H,S], [V,S,S], [S,H,S], [S,S,V], [S,H,S] ], # 5 [ [S,H,S], [V,S,S], [S,H,S], [V,S,V], [S,H,S] ], # 6 [ [S,H,S], [S,S,V], [S,S,S], [S,S,V], [S,S,S] ], # 7 [ [S,H,S], [V,S,V], [S,H,S], [V,S,V], [S,H,S] ], # 8 [ [S,H,S], [V,S,V], [S,H,S], [S,S,V], [S,H,S] ] # 9 ] attr_reader :height def initialize( num, size ) @matrix = @@segments[ num ].deep_clone @height = @matrix.size self.scale_to_size( size ) if size > 1 end def scale_to_size( size ) t = size - 1 @matrix.each { |l| t.times { l.insert(-2, S) } } @matrix.each { |l| l.fill(H, l.index(H), size) if l.include?(H) } t.times { @matrix.insert( 1, @matrix[1]) } t.times { @matrix.insert(-2, @matrix[-2]) } @height = @matrix.size end def display_line( line ) print @matrix[ line ], " " end end # ---------------------------------------------------------------------- class LCD def initialize( num, size=1 ) @digits = Array.new num.each_byte { |b| @digits << Digit.new( b.to_i - 48, size ) } end def display for line in 0...@digits.first.height @digits.each { |d| d.display_line( line ) } puts end end end # ---------------------------------------------------------------------- def print_usage( message=nil ) puts "Usage: lcd [-s size] digits" end # ---------------------------------------------------------------------- print_usage & exit if ARGV.empty? size = 2 opts = GetoptLong.new( ["--size", "-s", GetoptLong::REQUIRED_ARGUMENT] ) opts.each { |opt, val| size = val.to_i if opt == "--size" } print_usage & exit if ARGV.empty? digits = ARGV[0].gsub( /[^0-9]/, "" ) lcd = LCD.new( digits, size ) lcd.display # ---------------------------------------------------------------------- **************************** [end code ] **************************** -- Luc Heinrich - lucsky@mac.com