Here's a Ruby newbie attempt:
************************* lcd_quiz.rb *************************
zero = [[" ", "-", " "],
["|", " ", "|"],
[" ", " ", " "],
["|", " ", "|"],
[" ", "-", " "]]
one = [[" ", " ", " "],
[" ", " ", "|"],
[" ", " ", " "],
[" ", " ", "|"],
[" ", " ", " "]]
two = [[" ", "-", " "],
[" ", " ", "|"],
[" ", "-", " "],
["|", " ", " "],
[" ", "-", " "]]
three = [[" ", "-", " "],
[" ", " ", "|"],
[" ", "-", " "],
[" ", " ", "|"],
[" ", "-", " "]]
four = [[" ", " ", " "],
["|", " ", "|"],
[" ", "-", " "],
[" ", " ", "|"],
[" ", " ", " "]]
five = [[" ", "-", " "],
["|", " ", " "],
[" ", "-", " "],
[" ", " ", "|"],
[" ", "-", " "]]
six = [[" ", "-", " "],
["|", " ", " "],
[" ", "-", " "],
["|", " ", "|"],
[" ", "-", " "]]
seven = [[" ", "-", " "],
[" ", " ", "|"],
[" ", " ", " "],
[" ", " ", "|"],
[" ", " ", " "]]
eight = [[" ", "-", " "],
["|", " ", "|"],
[" ", "-", " "],
["|", " ", "|"],
[" ", "-", " "]]
nine = [[" ", "-", " "],
["|", " ", "|"],
[" ", "-", " "],
[" ", " ", "|"],
[" ", "-", " "]]
$numbers = [zero, one, two, three, four, five, six, seven, eight, nine]
def normalized_xy(x, y, size)
norm_x = case x % (size + 3)
when 0 then 0
when size + 1 then 2
else 1
end
norm_y = case y
when 0 then 0
when size * 2 + 2 then 4
when size + 1 then 2
when 1..(size+1) then 1
else 3
end
[norm_x, norm_y]
end
def stretch(numstring, size = 2)
nums = numstring.scan(/\d/).collect { |n| n.to_i }
single_len = (size + 3) # add a space between numbers
total_len = single_len * nums.length - 1
height = size*2 + 3
arr = Array.new(height) { |y|
Array.new(total_len) { |x|
norm_x, norm_y = normalized_xy(x, y, size)
index = (x/(single_len)).floor
num = nums[index]
((x+1) %(single_len) == 0) ? " " : $numbers[num][norm_y][norm_x]
}
}
arr.collect! { |line| line.join }
arr.join("\n")
end
if __FILE__ == $0
require 'optparse'
size = 2
ARGV.options do |opts|
opts.banner = "Usage: ruby #$0 [options] number_string"
opts.on("-s", "--size SIZE", Integer, "the size to print the LCD numbers.", " defaults to 2") do |s|
size = s.to_i
end
opts.on_tail("-h", "--help", "show this message") do
puts opts
exit
end
opts.parse!
if ARGV[0] !~ /^\d+$/
puts opts
exit
end
end
puts stretch(ARGV[0], size)
end
*********************** end lcd_quiz.rb ***********************
-Lee
···
-----Original Message-----
From: Ruby Quiz [mailto:james@grayproductions.net]
Sent: Friday, January 07, 2005 6:49 AM
To: ruby-talk ML
Subject: [QUIZ] LCD Numbers (#14)
The three rules of Ruby Quiz:
1. Please do not post any solutions or spoiler discussion for this quiz until
48 hours have passed from the time on this message.
2. Support Ruby Quiz by submitting ideas as often as you can:
http://www.grayproductions.net/ruby_quiz/
3. Enjoy!
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
This week's quiz is to write a program that displays LCD style numbers at adjustable sizes.
The digits to be displayed will be passed as an argument to the program. Size should be controlled with the command-line option -s
follow up by a positive integer. The default value for -s is 2.
For example, if your program is called with:
> lcd.rb 012345
The correct display is:
-- -- -- --
> > > > > > > >
> > > > > > > >
-- -- -- --
> > > > > > >
> > > > > > >
-- -- -- --
And for:
> lcd.rb -s 1 6789
Your program should print:
- - - -
> > > > > >
- - -
> > > > > >
- - -
Note the single column of space between digits in both examples. For other values of -s, simply lengthen the - and | bars.