From: Erik Veenstra Date: 2007-04-23T01:20:27+09:00 Subject: Re: Morse Code (#121) Here's a more practical Morse parser. (Although it's not part of the quiz...) gegroet, Erik V. - http://www.erikveen.dds.nl/ ---------------------------------------------------------------- $ cat morse2.rb class Morse MORSE_CODES = %w{.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..}.zip(("a".."z").to_a) DICTIONARY_WORDS = File.open("/usr/share/dict/words"){|f| f.read}.downcase.split(/[^a-z]/) rescue nil def parse(sequence) real_words(find_words(sequence.gsub(/\s+/, ""))) end private def find_words(sequence, word="", results=[]) if sequence.empty? results << word else MORSE_CODES.each do |seq, chr| if sequence.index(seq) == 0 find_words(sequence[seq.length..-1], word+chr, results) end end end results end def real_words(words) words & DICTIONARY_WORDS rescue words end end puts( $stdin.read.split(/\r*\n+/).collect do |sequence| list = Morse.new.parse(sequence) case list.length when 0 then "?" when 1 then list[0] else "(#{list.join("|")})" end end.join(" ") ) ---------------------------------------------------------------- $ cat morse.txt .. .... --- .--. . -.-- --- ..- .- .-. . .- -... .-.. . - --- .-. . .- -.. - .... .. ... ... . -. - . -. -.-. . ---------------------------------------------------------------- $ ruby morse2.rb < morse.txt i hope you (al|are|end|rd) (abets|able|adele|pile|wests) to (lad|lane| read|rune) (nisei|thees|these|this) sentence ----------------------------------------------------------------