forked from hackyourlife/lima-gold
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmorse.py
62 lines (56 loc) · 2.28 KB
/
morse.py
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# -*- coding: utf-8 -*-
# vim:set ts=8 sts=8 sw=8 tw=80 noet cc=80:
"""
Functions to encode and decode morse code
"""
import re
strip = re.compile("\s{2,}")
CHARS_TO_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": "−−−−−", "À": "·−−·−",
"Ä": "·−·−", "È": "·−··−", "É": "··−··", "Ö": "−−−·",
"Ü": "··−−", "ß": "···−−··", "CH": "−−−−", "Ñ": "−−·−−",
".": "·−·−·−", ",": "−−··−−", ":": "−−−···", ";": "−·−·−·",
"?": "··−−··", "-": "−····−", "_": "··−−·−", "(": "−·−−·",
")": "−·−−·−", "'": "·−−−−·", "=": "−···−", "+": "·−·−·",
"/": "−··−·", "@": "·−−·−·", "!": "−·−·−−", '"': "·−··−·",
"$": "···−··−"}
MORSE_TO_CHARS = {CHARS_TO_MORSE[key]: key for key in CHARS_TO_MORSE}
def encode(msg):
"""
Decode a string to morse code
"""
text = []
for letter in msg.upper():
if letter in CHARS_TO_MORSE:
text.append(CHARS_TO_MORSE[letter])
elif letter == " ":
text.append("")
else:
text.append(CHARS_TO_MORSE["?"])
return " ".join(text)
def decode(msg):
"""
Decode a string containing morse code
"""
tmp = []
for letter in msg.replace(".", "·").replace("-", "−").split(" "):
if len(letter) == 0:
tmp.append(" ")
elif letter in MORSE_TO_CHARS:
tmp.append(MORSE_TO_CHARS[letter])
return strip.sub(" ", "".join(tmp).lower().strip())
def valid(msg):
"""
Check if a string contains morse code
"""
msg = strip.sub(" ", msg.strip()) # 2 or more spaces -> 2 spaces
tmp = decode(msg)
if len(msg.split(" ")) == len(tmp):
return True
return False