From: Sea&Gull Date: 2005-01-10T00:21:23+09:00 Subject: Re: [QUIZ] LCD Numbers (#14) Hi! Maybe this is irrelevant, but what if your script would be called such way: lcd.rb -b accc 123 lcd.rb -s accc gfgdf 123 lcd.rb -s accc 123 gfgdf lcd.rb - 2 123 ? :o) -- s&g Luc Heinrich wrote: > Ruby Quiz wrote: > > >>This week's quiz is to write a program that displays LCD style numbers at >>adjustable sizes. > > > Here's my solution: > > **************************** [begin code ] **************************** > > #!/usr/local/bin/ruby -w > > require 'getoptlong' > > # --------------------------------------------------------------------- > > class Digit > > @@chars = [ " ", "-", "|" ] > @@segments = > [ > [ [0,1,0], [2,0,2], [0,0,0], [2,0,2], [0,1,0] ], # 0 > [ [0,0,0], [0,0,2], [0,0,0], [0,0,2], [0,0,0] ], # 1 > [ [0,1,0], [0,0,2], [0,1,0], [2,0,0], [0,1,0] ], # 2 > [ [0,1,0], [0,0,2], [0,1,0], [0,0,2], [0,1,0] ], # 3 > [ [0,0,0], [2,0,2], [0,1,0], [0,0,2], [0,0,0] ], # 4 > [ [0,1,0], [2,0,0], [0,1,0], [0,0,2], [0,1,0] ], # 5 > [ [0,1,0], [2,0,0], [0,1,0], [2,0,2], [0,1,0] ], # 6 > [ [0,1,0], [0,0,2], [0,0,0], [0,0,2], [0,0,0] ], # 7 > [ [0,1,0], [2,0,2], [0,1,0], [2,0,2], [0,1,0] ], # 8 > [ [0,1,0], [2,0,2], [0,1,0], [0,0,2], [0,1,0] ] # 9 > ] > > attr_reader :height > > def initialize( num, size ) > @matrix = @@segments[ num ] > @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, 0) } } > @matrix.each { |l| l.fill(1, l.index(1),size) if l.include?(1) } > t.times { @matrix.insert( 1, @matrix[1]) } > t.times { @matrix.insert(-2, @matrix[-2]) } > @height = @matrix.size > end > > def display_line( line ) > @matrix[ line ].each { |c| print @@chars[c] } > print " " > 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 ] ****************************** >