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í

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

<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.

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!

 
ulohy/morse/start.txt · Last modified: 2022/08/22 14:18 by xposik