From: Brian Krahmer Date: 2007-04-26T06:42:52+09:00 Subject: [QUIZ][SOLUTION] Morse Code (#121) Here is my solution to the morse code problem. The meat of is only about 10 lines, and I think it's pretty readable, so hopefully it will be viewed as a good solution. I used the dictionary installed on my ubuntu system to display a * after words found in it. BTW, this is my first submission. brian require 'singleton' class Word LETTERS = [ ['.-', 'A'], ['-.', 'N'], ['-...', 'B'], ['---', 'O'], ['-.-.', 'C'], ['.--.', 'P'], ['-..', 'D'], ['--.-', 'Q'], ['.', 'E'], ['.-.', 'R'], ['..-.', 'F'], ['...', 'S'], ['--.', 'G'], ['-', 'T'], ['....', 'H'], ['..-', 'U'], ['..', 'I'], ['...-', 'V'], ['.---', 'J'], ['.--', 'W'], ['-.-', 'K'], ['-..-', 'X'], ['.-..', 'L'], ['-.--', 'Y'], ['--', 'M'], ['--..', 'Z'] ] def initialize(word) @morse = word end def parse check_match(0, [], 0) end def check_match(word_offset, found_letters, found_letters_length) if found_letters_length == @morse.size word = found_letters.join('') print word print ' *' if Dictionary.instance.has_word?(word) puts return end 0.upto(LETTERS.size-1) do |index| morse_letter = LETTERS[index][0] next if word_offset + morse_letter.size > @morse.size if @morse[word_offset..(word_offset + morse_letter.size - 1)] == morse_letter check_match(word_offset + morse_letter.size, found_letters.clone.push(LETTERS[index][1]), found_letters_length + morse_letter.size) end end end end class Dictionary include Singleton def load @entries = {} File.open('/usr/share/dict/words') do |file| file.each_line do |line| @entries[line.chomp.upcase] = 1 end end end def has_word?(word) @entries[word] end end Dictionary.instance.load until $stdin.eof? Word.new($stdin.gets.chomp).parse end