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.