a60b9a5f788c9dd03911caea48d0ef49587750c6
[ruby_quiz.git] / lcd.rb
1 #! /usr/bin/env ruby
2
3 class LCD
4
5   # the display data for each digit at scale == 1
6   # each digit is a 3 x 5 array of characters.
7   @@display_data = {
8     0 => [ " - ", "| |", "   ", "| |", " - " ],
9     1 => [ "   ", "  |", "   ", "  |", "   " ],
10     2 => [ " - ", "  |", " - ", "|  ", " - " ],
11     3 => [ " - ", "  |", " - ", "  |", " - " ],
12     4 => [ "   ", "| |", " - ", "  |", "   " ],
13     5 => [ " - ", "|  ", " - ", "  |", " - " ],
14     6 => [ " - ", "|  ", " - ", "| |", " - " ],
15     7 => [ " - ", "  |", "   ", "  |", "   " ],
16     8 => [ " - ", "| |", " - ", "| |", " - " ],
17     9 => [ " - ", "| |", " - ", "  |", " - " ]
18   }
19
20   def initialize(scale)
21     @scale = Integer(scale)
22   end
23
24   def find_digits(number)
25     number = Integer(number)
26     digits = []
27     while number > 0
28       number, digit = number.divmod(10)
29       digits.unshift(digit)
30     end
31     digits
32   end
33
34   def draw(number)
35     # decompose our number into an array of digits
36     digits = find_digits(number)
37     
38     rows = []
39     (0..4).each do |line|
40       row = ""
41       digits.each do |digit|
42         row << @@display_data[digit][line]
43         row << " "
44       end
45       row << "\n"
46       rows << row
47     end
48
49     rows.each do |row|
50       # first widen
51
52       # note, there is probably a better way, but what I want to do is
53       # repeat the character in the middle position of each scale == 1
54       # digit.
55       row2 = ""
56       (0..row.length).each do |index|
57         next unless row[index]
58         row2 << (row[index] * (@scale - 1)) if (index % 4) == 1
59         row2 << row[index]
60       end
61       
62       # then repeat
63       print row2 * (@scale - 1) if row2 =~ /\|/
64       print row2
65     end
66
67   end
68 end
69
70 if __FILE__ == $0
71   # parse options
72   require 'optparse'
73
74   options = {}
75   optparse = OptionParser.new do |opts|
76     opts.banner = "usage: lcd.rb [-s scale] number"
77     options[:scale] = 2
78     opts.on( '-s', '--scale SIZE', "display using scale") do |size|
79       options[:scale] = size
80     end
81   end
82
83   optparse.parse!
84
85   display = LCD.new(options[:scale])
86   number = ARGV.shift || 0
87   display.draw(number)
88 end