====== Morseovka ======
Dokážete dekódovat zprávu v Morseovce?
===== Úloha č. 1 =====
^ 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í |
[[https://cs.wikipedia.org/wiki/Morseova_abeceda|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".
==== Specifikace ====
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.
==== Příklad ====
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.
===== Úloha č. 2 =====
^ 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.
==== Specifikace ====
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
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.
===== Hodnocení =====
Za správné řešení úlohy je možné získat až 10 bodů:
* až 5 b. za správnou implementaci funkce ''decode_morse_with_separators''
* až 5 b. za správnou implementaci funkce ''decode_morse_without_separators''
Držíme palce!