aboutsummaryrefslogtreecommitdiff
path: root/challenge-035/paulo-custodio/python/ch-2.py
blob: f38b35a5bb4423017b4467d6dc70e9593ef95e4d (plain)
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:])))