From: Matt Hulse Date: 2007-04-23T02:10:09+09:00 Subject: Re: Morse Code (#121) Here's my solution. Not much to it. I didn't do any dictionary stuff. Pass -v to see all interpretations printed out. Otherwise, just number of interpretations printed. #Author: Matt Hulse #File : morse.rb #Email : matt.hulse@gmail.com #Web : http://www.matt-hulse.com class Morse attr_reader :morse_code, :message, :result def initialize(message) @morse_code = { :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 => '--..' } @message = message end def translate @result = do_translation(@message).flatten puts "Translation Complete" puts "#{@result.length} interpretations found." end def do_translation(str) result = Array.new (1..4).each{|n| morse = str[0,n] this_char = decode(morse) if(this_char.nil?) then puts "Invalid char, skipping to next" if $DEBUG next else #is a valid character if(n == str.size) result << this_char elsif(n < str.size) result << do_translation(str[n,str.size]).flatten.collect{|c| this_char + c } end end } return result end def encode(char) encoded = "" if(char.size > 1) then char.split("").each{|letter| encoded += encode(letter) + "|" } encoded.chop! else result = @morse_code.find{|key,value| key == char.to_sym} if(result.nil?) return nil else encoded = result[1].to_s end end encoded end def decode(morse) result = @morse_code.find{|key,value| value == morse} if (not result.nil?) then result[0].to_s else return nil end end def show_result @result.each{|res| printf("#{encode(res)}%25s\n",res) } end end if __FILE__ == $0 then code = ARGV[0] ||= "...---..-....-" morse = Morse.new(code) morse.translate morse.show_result if $VERBOSE end Matt Hulse matt.hulse@gmail.com http://www.matt-hulse.com On Apr 20, 6:15 am, Ruby Quiz wrote: > The three rules of Ruby Quiz: > > 1. Please do not post any solutions or spoiler discussion for this quiz until > 48 hours have passed from the time on this message. > > 2. Support Ruby Quiz by submitting ideas as often as you can: > > http://www.rubyquiz.com/ > > 3. Enjoy! > > Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone > on Ruby Talk follow the discussion. Please reply to the original quiz message, > if you can. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > > The idea for this quiz was given to me by Yossef Mendelssohn. > > Morse code is a way to encode telegraphic messages in a series of long and short > sounds or visual signals. During transmission, pauses are used to group letters > and words, but in written form the code can be ambiguous. > > For example, using the typical dot (.) and dash (-) for a written representation > of the code, the word ...---..-....- in Morse code could be an encoding of the > names Sofia or Eugenia depending on where you break up the letters: > > ...|---|..-.|..|.- Sofia > .|..-|--.|.|-.|..|.- Eugenia > > This week's quiz is to write program that displays all possible translations for > ambiguous words provided in code. > > Your program will be passed a word of Morse code on STDIN. Your program should > print all possible translations of the code to STDOUT, one translation per line. > Your code should print gibberish translations in case they have some meaning for > the reader, but indicating which translations are in the dictionary could be a > nice added feature. > > We will only focus on the alphabet for this quiz to keep things simple. Here > are the encodings for each letter: > > 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 --..