My solution for the lcd quiz
authorDavid Blacka <david@blacka.com>
Sun, 23 Oct 2011 14:36:17 +0000 (10:36 -0400)
committerDavid Blacka <david@blacka.com>
Sun, 23 Oct 2011 14:36:17 +0000 (10:36 -0400)
lcd.rb [new file with mode: 0755]

diff --git a/lcd.rb b/lcd.rb
new file mode 100755 (executable)
index 0000000..a60b9a5
--- /dev/null
+++ b/lcd.rb
@@ -0,0 +1,88 @@
+#! /usr/bin/env ruby
+
+class LCD
+
+  # the display data for each digit at scale == 1
+  # each digit is a 3 x 5 array of characters.
+  @@display_data = {
+    0 => [ " - ", "| |", "   ", "| |", " - " ],
+    1 => [ "   ", "  |", "   ", "  |", "   " ],
+    2 => [ " - ", "  |", " - ", "|  ", " - " ],
+    3 => [ " - ", "  |", " - ", "  |", " - " ],
+    4 => [ "   ", "| |", " - ", "  |", "   " ],
+    5 => [ " - ", "|  ", " - ", "  |", " - " ],
+    6 => [ " - ", "|  ", " - ", "| |", " - " ],
+    7 => [ " - ", "  |", "   ", "  |", "   " ],
+    8 => [ " - ", "| |", " - ", "| |", " - " ],
+    9 => [ " - ", "| |", " - ", "  |", " - " ]
+  }
+
+  def initialize(scale)
+    @scale = Integer(scale)
+  end
+
+  def find_digits(number)
+    number = Integer(number)
+    digits = []
+    while number > 0
+      number, digit = number.divmod(10)
+      digits.unshift(digit)
+    end
+    digits
+  end
+
+  def draw(number)
+    # decompose our number into an array of digits
+    digits = find_digits(number)
+    
+    rows = []
+    (0..4).each do |line|
+      row = ""
+      digits.each do |digit|
+        row << @@display_data[digit][line]
+        row << " "
+      end
+      row << "\n"
+      rows << row
+    end
+
+    rows.each do |row|
+      # first widen
+
+      # note, there is probably a better way, but what I want to do is
+      # repeat the character in the middle position of each scale == 1
+      # digit.
+      row2 = ""
+      (0..row.length).each do |index|
+        next unless row[index]
+        row2 << (row[index] * (@scale - 1)) if (index % 4) == 1
+        row2 << row[index]
+      end
+      
+      # then repeat
+      print row2 * (@scale - 1) if row2 =~ /\|/
+      print row2
+    end
+
+  end
+end
+
+if __FILE__ == $0
+  # parse options
+  require 'optparse'
+
+  options = {}
+  optparse = OptionParser.new do |opts|
+    opts.banner = "usage: lcd.rb [-s scale] number"
+    options[:scale] = 2
+    opts.on( '-s', '--scale SIZE', "display using scale") do |size|
+      options[:scale] = size
+    end
+  end
+
+  optparse.parse!
+
+  display = LCD.new(options[:scale])
+  number = ARGV.shift || 0
+  display.draw(number)
+end