1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#!/usr/bin/python3
# Challenge 035
#
# Challenge 035
#
# TASK #2
# Contributed by Paul Johnson
# Write a program to decode binary morse code.
# Consider how it might be possible to recover from badly formed morse code.
#
# a) by splitting the morse code on gaps
# b) without looking further than one digit ahead
import sys
import re
# morse code chart
MORSE = { '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':'--..', '1':'.----', '2':'..---', '3':'...--', '4':'....-',
'5':'.....', '6':'-....', '7':'--...', '8':'---..', '9':'----.',
'0':'-----'}
MORSE_INV = {v:k for k, v in MORSE.items()}
def decode_bin_morse(encoded):
encoded = re.sub(r"0+$", "", encoded) # remove trailing 0s
encoded = re.sub(r"0000000", "\n", encoded) # word gap
encoded = re.sub(r"000", " ", encoded) # character gap
encoded = re.sub(r"1110?", "-", encoded) # -
encoded = re.sub(r"10?", ".", encoded) # .
text = ""
words = encoded.split("\n")
for word in words:
chars = word.split()
for c in chars:
text += MORSE_INV[c]
text += " "
text = re.sub(r"\s+$", "", text)
return text
print(decode_bin_morse(" ".join(sys.argv[1:])))
|