stumpfer Brute-Force Morse-Code Dekoder

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Das Alphabet stimmt nicht:

Code: Alles auswählen

>>> len(ALPHABET)
25
Und Buchstaben die er nicht kennt, kann er auch nicht erkennen.
R und K sehen ausgesprochen ähnlich aus, was das Alphabet im Beispiel angeht.
Und deshalb findet er auch nicht "AKZENTE" aber durchaus "ARZENTE" ;)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ah ja... ich hatte nichte alle Morse-Sequenzen geprüft. Danke für den Hinweise!

Die Länge des Alphabets stimmt aber:

Code: Alles auswählen

>>> import morse_eval as me
>>> me.ALPHABET
{'-.-': 'K', '-.': 'N', '-...': 'B', '....': 'H', '-..-': 'X', '---': 'O', '-': 'T', '--..': 'Z', '..': 'I', '..-': 'U', '.--.': 'P', '...-': 'V', '.-.': 'R', '.--': 'W', '.-..': 'L', '--': 'M', '.': 'E', '-.--': 'Y', '--.': 'G', '.-': 'A', '.---': 'J', '--.-': 'Q', '-.-.': 'C', '...': 'S', '-..': 'D', '..-.': 'F'}
>>> len(me.ALPHABET)
26
Zumindest in meiner Version ;-)

Hier nochmal das Listing für Python 3, was jetzt richtig arbeiten sollte:

Code: Alles auswählen

ALPHABET = {
".-": "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 consume(code, suffixes=None):
    if not code:
        yield ()
    else:
        if suffixes is None:
            suffixes = {}
  
        for morse, letter  in ALPHABET.items():
            if code.startswith(morse):
                suffix = code[len(morse):]
                try:
                    remainder = suffixes[suffix]
                except KeyError:
                    remainder = set(consume(suffix, suffixes))
                    suffixes[suffix] = remainder
     
                for sub in remainder:
                    yield (letter,) + sub
     
def main():
    code = ".--.---...-.-." #POSTEN
     
    for message in set(consume(code)):
        print("".join(message))
     
     
if __name__ == "__main__":
    main()
Gruß, noisefloor
Antworten