[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