People still work the old quizzes it seems...

James Edward Gray II

Begin forwarded message:

> From: Greg Borenstein <greg.borenstein / gmail.com>
> Date: June 8, 2006 3:43:17 PM CDT
> To: submission / rubyquiz.com
> Subject: Please Forward: Ruby Quiz Submission
>
> Hello,
>
> I am an intermediate Ruby on Rails programmer in Portland, Oregon.  
> Recently, I was looking to improve my Ruby programming chops and I  
> happened on the Ruby Quiz book. I've started working my way through  
> the quizzes and am finding them very educational. I wanted to write  
> to thank you for putting together this excellent project and to  
> submit a solution.
>
> I didn't know if it was appropriate to send the solution to an old  
> quiz directly to the mailing list (where it might appear highly out  
> of context) so I thought I'd send it to you first. Below, please  
> find my solution to the LCD Numbers quiz. By using method missing,  
> it was pretty easy for me to include hex characters (and,  
> potentially, any others you could figure out how to draw) as you  
> suggested in the additional exercises.
>
> Anyway, thanks for the work you do on Ruby Quiz. I hope you enjoy  
> my solution.
>
> yours,
>
> Greg
> --
> http://mfdz.com/atduskgreg
> http://www.urbanhonking.com/ideasfordozens
> http://www.atduskmusic.com
>
>
> # QUIZ: LCD Numbers
> # http://www.rubyquiz.com/quiz14.html
> # greg / mfdz.com
> # 8 June 2006
>
> require 'getoptlong'
>
> S = " "
> H = "-"
> V = "|"
>
> @size = 2
>
> def m; "#{S}#{H * @size}#{S}"; end
> def l; "#{V}#{S * ( @size + 1 )}"; end
> def r;"#{S * (@size + 1) }#{V}"; end
> def o;"#{V}#{S * @size}#{V}"; end
> def n;"#{S * (@size + 2)}"; end
>
> def method_missing( number, result )
>   lines = case number
>     when :one   then %w(n r n r n)
>     when :two   then %w(m r m l m)
>     when :three then %w(m r m r m)
>     when :four  then %w(n o m r n)
>     when :five  then %w(m l m r m)
>     when :six   then %w(m l m o m)
>     when :seven then %w(m r n r n)
>     when :eight then %w(m o m o m)
>     when :nine  then %w(m o m r n)
>     when :zero  then %w(m o n o m)
>     when :a     then %w(m o m o n)
>     when :b     then %w(n l m o m)
>     when :c     then %w(m l n l m)
>     when :d     then %w(n r m o m)
>     when :e     then %w(m l m l r)
>     when :f     then %w(m l m l n)
>   end
>
>   lines.each_index do |i|
>     process_line i, send( lines[i].to_sym ), result
>   end
>   result
> end
>
> def process_line( number, string, result )
>   case number
>     when 0 then result[0] << string
>     when 1 then @size.times{ |i| result[i+1] << string }
>     when 2 then result[@size + 1] << string
>     when 3 then @size.times{ |i| result[i+ @size + 2] << string }
>     when 4 then result[result.length - 1] << string
>   end
>   result
> end
>
> def write_digit( n, arr )
>   a = %w(zero one two three four five six seven eight nine)
>   l = %w(a b c d e f)
>
>   send "#{a[n.to_i]}".to_sym, arr if n == "0" or n.to_i != 0
>   send "#{n}".to_sym, arr if l.include? n
> end
>
> #calculate the number of output lines based on the desired size
> def lines( size )
>   5 if size == 1
>   ( 2 * size ) + 3
> end
>
> opts = GetoptLong.new( [ "-s", GetoptLong::OPTIONAL_ARGUMENT ] )
> opts.each do |opt, arg|
>   if opt == "-s" && (arg == "0" or arg.to_i != 0)
>     @size = arg.to_i
>   else
>     puts "Usage: #$0 [-s SIZE] DIGITS"
>     exit
>   end
> end
> n = ARGV.shift
>
> #initialize the array so that it has the right number of slots
> arr = Array.new(lines(@size), "").collect!{|x| x * 2 } #to prevent  
> weird recurring-object gotcha
>
> numbers = n.scan(/\w/)
>
> numbers.each do |n|
>   write_digit( n, arr)
> end
>
> arr.each{|a| puts a }