From: James Barnett Date: 2007-04-23T07:10:07+09:00 Subject: Re: Morse Code (#121) Here's my solution to Ruby Quiz #121. Jim Barnett #!/usr/bin/env ruby class MorseCode attr_accessor :results attr_reader :words Alphabet = { 'A' => '.-', 'B' => '-...', 'C' => '-.-.', 'D' => '-..', 'E' => '.', 'F' => '..-.', 'G' => '--.', 'H' => '....', 'I' => '..', 'J' => '.---', 'K' => '-.-', 'L' => '.-..', 'M' => '--', 'N' => '-.', 'O' => '---', 'P' => '.--.', 'Q' => '--.-', 'R' => '.-.', 'S' => '...', 'T' => '-', 'U' => '..-', 'V' => '...-', 'W' => '.--', 'X' => '-..-', 'Y' => '-.--', 'Z' => '--..' } def initialize @results = [] @words = [] @words << load_dictionary end def to_text(input, output = "", words = @words) unless input.empty? m = matches(input) m.each do |char| to_text(input[Alphabet[char].length, input.length], output + char) end else @results << output end end def matches(input) Alphabet.select { |key, value| input[0, value.length] == value }.map { |v| v.first }.sort end def load_dictionary # dictionary.txt from http://java.sun.com/docs/books/tutorial/collections/interfaces/examples/dictionary.txt File.open("dictionary.txt", "r") do |file| file.each_line do |line| @words << line.chomp.upcase if line end end @words << 'SOFIA' @words << 'EUGENIA' end def in_dictionary?(str) @words.include?(str) end end $mc = MorseCode.new $mc.to_text(ARGV[0]) $mc.results.each { |r| puts "#{r} #{ $mc.in_dictionary?(r) ? "(in dictionary)" : "" }" }