Dokážete dekódovat zprávu v Morseovce?
Prerekvizity | Základy Pythonu, slovníky, práce s řetězci |
---|---|
Náročnost přemýšlení | Nížší až střední |
Náročnost programování | Nižší až střední |
Morseův kód (Morseovka) se používá při komunikaci prostřednictvím (obvykle) zvukových nebo světelných signálů. Je to metoda, jak zakódovat jednotlivé znaky jako sekvence impulzů zvuku/světla s různou dělkou.
Abychom mohli zapsat zprávu v Morseovce na papír, používá se obvykle znak .
pro krátký impuls, -
pro dlouhý impuls, /
jako oddělovač písmen a //
jako oddělovač slov. Pomocí Morseovky můžeme těmito znaky zapsat zprávu HELLO WORLD
jako ...././.-../.-../---//.--/---/.-./.-../-..
Vaším úkolem je napsat funkci, která vezme řetězec obsahující zprávu v Morseově abecedě a vrátí její čitelnou reprezentaci. Tedy např. zprávu
...././.-../.-../---//.--/---/.-./.-../-..
dekóduje jako “HELLO WORLD”.
V modulu decoder.py
, který budete odevzdávat, vytvořte funkci decode_morse_with_separators()
, která správně dekóduje zprávu v Morseovce. Funkce bude mít následující vstupy a výstupy:
Vstup | encoded_message | Zakódovaná zpráva. Řetězec tvořený znaky . , - , / . |
---|---|---|
Výstup | decoded_message | Dekódovaná, čitelná zpráva. Řetězec obsahující znaky abecedy. |
Oddělovače /
a //
na začátku či konci zprávy ignorujte.
Budete-li mít funkci decode_morse_with_separators()
správně implementovanou, její volání by mohlo vypadat asi takto:
>>> decode_morse_with_separators("...././.-../.-../---//.--/---/.-./.-../-..") HELLO WORLD
Zárodek této funkce může vypadat následovně:
def decode_morse_with_separators(encoded_message: str) -> str: "Decode a message encoded with Morse code to a sequence of characters" # Zde musíte dělat něco rozumného, tj. provést vlastní dekódování zprávy decoded_message = "HELLO WORLD" return decoded_message
Výše uvedený zárodek funkce vždy vrací řetězec HELLO WORLD
, což samozřejmě není správně. Naprogramovat funkci tak, aby fungovala správně pro libovolný validní vstup, je na vás.
Prerekvizity | Základy Pythonu, slovníky, práce s řetězci, práce se soubory |
---|---|
Náročnost přemýšlení | Střední |
Náročnost programování | Střední |
Dostali jsme zápis zprávy v Morseovce od nezkušeného radisty, který zapomněl zapsat oddělovače jednotlivých písmen a slov! Přesto bychom měli zkusit zprávu dekódovat!
Zpráva tedy vypadá např. takto
......-...-..---.-----.-..-..-..
a není jednoznačná! Lze ji dekódovat mnoha různými způsoby, např. jako HELLO WORLD
, ale také jako EEEEEETEEETEETTTETTTTTETEETEETEE
(a mnoha dalšími způsoby). Druhá možnost ale nedává dobrý smysl (není tvořena slovy).
Vaším úkolem je tedy napsat funkci, která najde jednu z možných smysluplných zpráv zakódovaných v Morseovce pomocí sekvence teček a čárek tak, aby dekódovaná zpráva byla tvořena slovy z daného slovníku.
V modulu decoder.py
, vytvořte funkci decode_morse_without_separators()
, která najde jednu možnou zprávu odpovídající zadané sekvenci teček a čárek. Funkce bude mít následující vstupy a výstupy:
Vstup | encoded_message | Zakódovaná zpráva. Řetězec tvořený znaky . a - . |
---|---|---|
Výstup | decoded_message | Dekódovaná, čitelná zpráva. Řetězec skládající se ze slov uvedených v daném slovníku. |
Slovník najdete v souboru dictionary.txt
. Žádná jiná slova se v dekódované zprávě nesmějí objevit! Každý řádek slovníku má formát
<word> <morse_code>
Nejdelší Morseův kód nějakého slova bez oddělovačů je dlouhý 45 znaků. I toho lze při konstrukci dekódovací funkce využít!
Zárodek funkce i příklad použití jsou téměř shodné, jako u předchozí funkce. Je-li více možných smysluplných zpráv odpovídajících dané sekvenci teček a čárek, stačí vrátit jednu z nich (první, na kterou narazíte).
Časový limit na dekódování zprávy jsou 2 sekundy.
Za správné řešení úlohy je možné získat až 10 bodů:
decode_morse_with_separators
decode_morse_without_separators
Držíme palce!