As a small exercise for getting up to speed with Python I decided to solve ruby quiz #121, which is to to write a function that finds all possible decodings of a string of Morse codes without letter- and word-separators. Given the nature of the problem I decided to use python’s list comprehensions for the solution.
Without further ado here is the code I ended up with:
#!/usr/bin/env python
import string
letters = [('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 decode(input):
if input == "" :
return [""]
else:
return [ letter + remaining
for letter, code in letters if input.startswith(code)
for remaining in decode(input[len(code):]) ]
# Some Testing code
def test(s, code):
if s in decode(code):
print code + " can be decoded as " + s
else:
print code + " can NOT be decoded as " + s
test("SOFIA", "...---..-....-")
test("SOPHIA", "...---..-....-")
test("EUGENIA", "...---..-....-")
Interesting, my solution is rather similar to Patrick Logan’s Erlang solution. And I find it simpler to understand than the Haskell solutions at the HaskellWiki.
Nice recursion bro.