Christian Theil H. wrote in post #237067:
Hi
Iβve implemented it using a simple backtracking search algorithm.
My code could probably be a lot more compact, and the first_letters
function could definitely be
much fasterβ¦
class Morse
@@alpha = {
βaβ => β.-β,
βbβ => β-β¦β,
βcβ => β-.-.β,
βdβ => β-β¦β,
βeβ => β.β,
βfβ => ββ¦-.β,
βgβ => ββ.β,
βhβ => ββ¦β,
βiβ => ββ¦β,
βjβ => β.ββ,
βkβ => β-.-β,
βlβ => β.-β¦β,
βmβ => βββ,
βoβ => βββ,
βpβ => β.β.β,
βqβ => ββ.-β,
βrβ => β.-.β,
βsβ => ββ¦β,
βtβ => β-β,
βuβ => ββ¦-β,
βvβ => ββ¦-β,
βwβ => β.ββ,
βxβ => β-β¦-β,
βyβ => β-.ββ,
βzβ => βββ¦β
}
def initialize
# Reverse index the array
@rev = {}
@@alpha.each { |k,v| @rev[v] = k.to_s }
end
Returns all letters matching the morse str at this pos
def first_letters(morse, pos)
letters = []
@rev.keys.each { |k| letters << k unless
morse[posβ¦-1].scan(/^#{k.gsub(".","\.")}.*/).empty? }
letters
end
Returns an array of words that matches βmorseβ string
Itβs basically a recursive function with bactracking
def morse2words(morse, pos = 0 , seen = ββ)
solutions = []
first_letters(morse, pos).each do |l|
if morse.length == pos + l.length
solutions << β#{seen}#{@rev[l]}β
else
result = morse2words(morse,(pos+l.length),"#{seen}#{@rev[l]}")
solutions += result
end
end
solutions
end
Converts a word to a morse string, used for testing
def word2morse(word)
morse = ββ
word.each_byte { |b| morse << @@alpha[b.chr] }
morse
end
end
######################
Test:
def test_word2morse
m = Morse.new
raise unless m.word2morse(βsofiaβ) == ββ¦ββ¦-β¦-β
end
def test_first_letters
m = Morse.new
raise unless m.first_letters(".", 0) == [ β.β ];
raise unless m.first_letters("β.--β¦β.-.", 0) == ["β", β-β, ββ.β,
ββ.-β]
end
def test_morse2words
m = Morse.new
sofia = ββ¦ββ¦-β¦-β
solutions = m.morse2words(sofia)
solutions.each do |s|
if m.word2morse(s) != sofia
puts βbad solution: #{s}β
puts βyields #{m.word2morse(s)} in morseβ
raise
end
end
end
test_word2morse
test_first_letters
test_morse2words
Thanks, this was useful. You were missing an βnβ, I fixed it for you:
@@alpha = {
β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β => βββ¦β
}