folgende Aufgabenstellung: es gibt Morse-Code, wo aller Leerzeichen fehlen. Was das dekodieren sehr schwierig macht, weil Buchstaben im Morsealphabet zwischen 1 und 4 (nur Buchstaben) bzw. zwischen 1-6 (inkl. Zahlen und Sonderzeichen) lang sein können.
Mein Ansatz für eine relativ stumpfe Brutforce-Dekodierung ist wie folgt:
- eine Liste mit allen möglichen (und nicht unbedingt sinnvollen) Längenkombinaitonen berechnen
- prüfen, welche Längenkombination die gleiche Länge wie der Morse-Code haben
- der Ergebnisliste hinzufügen
.-.- hatte die gültigen Längenkombinaton (1,1,1,1), (1,2,1), (2,1,1), (1,1,2), (3,1), (1,3), (4) - aber eben nicht z.B. (2,3)
Auf Basis der Längenkombis kann man dann den Morsestring in Teilstring zerlegen und prüfen, wo was sinnvolles & gültiges raus kommt.
Das folgende Skripte findet die gültige Längenkombis:
Code: Alles auswählen
from itertools import product
class MorseCodeEvaluator(object):
def __init__(self, morse_code, a_to_z_only=False):
self.morse_code = morse_code
self.a_to_z_only = a_to_z_only
def gen_possible_products(self):
if self.a_to_z_only == True:
upper_number = 5
else:
upper_number = 7
sequences = product(range(1,upper_number), repeat=len(self.morse_code))
possibilities = []
for sequence in sequences:
sum_ = 0
temp_seq = []
for number in sequence:
sum_ = sum_ + int(number)
temp_seq.append(number)
if sum_ == len(self.morse_code):
if temp_seq not in possibilities:
possibilities.append(temp_seq)
break
return possibilities
if __name__ == '__main__':
import time
morse_code = '--.....--.-.-'
my_eval = MorseCodeEvaluator(morse_code, a_to_z_only=True)
start = time.asctime(time.localtime(time.time()))
print('Starting evaluation of morse code.')
print('Morse code contains {} symbols'.format(len(my_eval.morse_code)))
my_eval.gen_possible_products()
end = time.asctime(time.localtime(time.time()))
print('''length morse code: {0},\
start: {1},\
end: {2}'''.format(len(morse_code), start, end))
Aber hat einer eine Idee, wie man den Code effizienter = schneller machen kann?
Zum Testen solltet ihr überigens die Länge des Morsecodes auf 10 Zeichen oder so verringern, dann dauert die Berechnung auch nur ein paar Sekunden.
Gruß, noisefloor