From: Christian Neukirchen Date: 2007-04-24T21:12:40+09:00 Subject: Re: [QUIZ] Morse Code (#121) Ruby Quiz writes: > 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. This is my solution with the Morse code passed as argument; you can enable a directory by passing -d. It uses simple recursion. #!ruby -s $morse = Hash[*%w{ 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 --.. }].invert if $d words = {} File.readlines("/usr/share/dict/words").each { |word| words[word.downcase.chomp] = true } end def allmorse(s, t="", &b) if s.empty? yield t else 1.upto(s.size) { |n| $morse[s[0,n]] && allmorse(s[n..-1], t+$morse[s[0,n]], &b) } end end allmorse (ARGV[0] || ".-...--...-.--").delete("^.-") do |word| puts word if !$d || words.include?(word.downcase) end __END__ Example: $ ruby quiz121.rb ETEEETTEEETETT ETEEETTEEETEM ETEEETTEEETAT ETEEETTEEETW ETEEETTEEENTT : : : : LPUW LPFTT LPFM $ ruby quiz121.rb -d RUBY $ ruby quiz121.rb -d ...././.-../.-../--- HELLO -- Christian Neukirchen http://chneukirchen.org