OK, Martin, die uitleg is klaar en duidelijk.
Ik kijk uit naar wat dat scriptje mogelijk gaat opleveren qua leesbare woorden (of cijfers).
Tiens, Python vernoemd naar Monthy Python, dat wist ik niet. Leuk weetje bijgeleerd vandaag. Bedankt!
Ik was ook benieuwd dus ik heb even een Python scriptje geschreven. Heb gelijk maar even 2 versies gemaakt, eentje voor standaard morse tabel en eentje voor de USA versie. Het programma is gelijk alleen aan het begin zit een andere structuur voor de code tabel. De scripts vind je onder de spoilers.
m_codes = { \
'.-' : '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',\
'-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4',\
'.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9',\
'.-.-.-': '.', '--..--': ',', '..--..': '?', '-.-.--': '!', '-..-.': '/',\
'---...': ':', '-....-': '-', '-...-': '=', '.--.-.': '@', '.-...': '&'\
}
def decode( arg_code, arg_letters, arg_max_char) :
for m_code in m_codes:
code = arg_code
letters = arg_letters
if code.startswith( m_code):
letters += m_codes[m_code]
rest = code[len(m_code):]
if len( rest) == 0 and len( letters) <= arg_max_char:
print( letters)
else:
decode( rest, letters, arg_max_char)
def decodeer( arg_code, arg_max_char=80):
decode( arg_code, '', arg_max_char)
m_codes = { \
'.-' : 'A', '-...': 'B', '-..' : 'D', '.' : 'E',\
'.-.' : 'F', '--.' : 'G', '....': 'H', '..' : 'I', '-.-.': 'J',\
'-.-' : 'K', '=' : 'L', '--' : 'M', '-.' : 'N',\
'.....': 'P', '..-.': 'Q', '...' : 'S', '-' : 'T',\
'..-' : 'U', '...-': 'V', '.--' : 'W', '.-..': 'X',\
'.--.' : '1', '..-..': '2', '...-.': '3', '....-': '4', '---': '5',\
'......': '6', '--..': '7', '-....': '8', '-..-' : '9',\
'..--..': '.', '.-.-': ',', '-..-.': '?', '---.': '!', '----': '§'\
}
def decode( arg_code, arg_letters, arg_max_char) :
for m_code in m_codes:
code = arg_code
letters = arg_letters
if code.startswith( m_code):
letters += m_codes[m_code]
rest = code[len(m_code):]
if len( rest) == 0 and len( letters) <= arg_max_char:
print( letters)
else:
decode( rest, letters, arg_max_char)
def decodeer( arg_code, arg_max_char=80):
decode( arg_code, '', arg_max_char)
Edit:De manier waarop het script werkt is een leuk voorbeeld hoe je een complex probleem aanpakt. Je vertaalt het probleem naar een deelprobleem, dat je weer vertaalt naar een deelprobleem, etc. totdat je een heel simpel deelprobleem overhoudt. De uitleg hiervan vind je onder de volgende spoiler.
Wat je nodig hebt is een functie die voor elke morse code onderzoekt of de rest van de te decoderen code begint met deze code. Voor al deze codes voeg je de bijbehorende letter toe aan de letters die je al had gevonden bij het decoderen van het begin van de code, en voer je vervolgens dezelfde functie uit voor het restant van de code. Belangrijk is dat je daarbij het gevonden resultaat tot op dat punt ook meegeeft. Dit doe je net zo vaak totdat je bij het einde van de te decoderen code bent aangekomen. De lengte van de nog te decoderen rest van de string is dan 0. Op dat moment print je de opgebouwde reeks van letters uit. Tenminste als deze reeks niet meer letters bevat dan het opgegeven maximum aantal. Hiermee voorkom je dat lettercombinaties met heel veel E's (voor elke punt) en T's voor elke streep worden genegeerd. Ook de letters die overkomen met '..', '.-', '-.' en '--' (I, A, N en M) zullen vaak voorkomen resultaten met veel letters. Resultaten met 5 of minder letters zullen meerdere letters bevatten die 3 of 4 code symbolen nodig hebben.
Voor de eerste reeks leverde het programma maar liefst 386 "woorden" op. Voor 2 andere 1490 (!), en dat was nog voordat ik cijfers en leestekens had toegevoegd aan de morse code tabel.
Dit komt omdat elke losse . of - een letter kan zijn. Daarom heb ik een parameter toegevoegd waarmee je het maximum aantal letters van de gezochte woorden kan aangeven. De gevonden woorden verschijnen automatisch in alfabetische volgorde.
Voor de code op 48:38 heb ik de volgende woorden gevonden: LEEP, LEUN, LIAN, LIEG, LIP, RESTTE, RIEP.
Voor 1:01:27 heb ik gevonden: AVARI, RELDE, RUINDE en RUIDE. Van de rest is geen chocola te maken.
Met de Amerikaans tabel heb ik geen enkel zinnig woord gevonden. Bij de Amerikaanse versie moet je i.p.v. een '-' een '=' ingeven voor de lange streep (de letter L).
EditOm het script uit te proberen, kun je naar de volgende site gaan:
https://www.w3schools.com/python/trypython.asp?filename=demo_defaultKopieer hier één van mijn scripts en voeg daar het decodeer commando toe voor de string die je wil decoderen, bijvoorbeeld:
decodeer( '.-.....--.', 5)
Veel plezier!