From: Sean Ross Date: 2005-01-10T08:21:25+09:00 Subject: Re: [SOLUTION] Ruby Quiz #14 LCD Numbers # lcd.rb require 'optparse' opts = OptionParser.new size = 2 # default opts.on("-s","--size VAL", Integer){|val| size=val} digit_entry = opts.parse(*ARGV).first raise "size must be greater than zero (given #{size})" if size <= 0 raise "'#{digit_entry}' contains non-digit characters" if digit_entry =~ /\D/ # to hold LCD format information LCD = Struct.new(:upper_crossbar, :upper_uprights, :middle_crossbar,:lower_uprights,:lower_crossbar) # lcd segment formats nothing = " #{' '*size} " crossbar = " #{'-'*size} " leftpost = "|#{' '*size} " rightpost = " #{' '*size}|" uprights = "|#{' '*size}|" # digits in LCD format LCDs = {'0'=>LCD[crossbar,uprights,nothing,uprights,crossbar], '1'=>LCD[nothing,rightpost,nothing,rightpost,nothing], '2'=>LCD[crossbar,rightpost,crossbar,leftpost,crossbar], '3'=>LCD[crossbar,rightpost,crossbar,rightpost,crossbar], '4'=>LCD[nothing,uprights,crossbar,rightpost,nothing], '5'=>LCD[crossbar,leftpost,crossbar,rightpost,crossbar], '6'=>LCD[crossbar,leftpost,crossbar,uprights,crossbar], '7'=>LCD[crossbar,rightpost,nothing,rightpost,nothing], '8'=>LCD[crossbar,uprights,crossbar,uprights,crossbar], '9'=>LCD[crossbar,uprights,crossbar,rightpost,crossbar]} # simulate LCD panel display digits = digit_entry.split(//).collect{|d| LCDs[d]} LCD.members.each_with_index do |segment_name, index| panel_segment = digits.collect{|lcd| lcd[segment_name]}.join(' ') repeat = index%2==0 ? 1 : size # only repeat 'upright' segments repeat.times{puts panel_segment} end