Slovníky  14. prosince 2022

Materiály

Nejste účastníkem kurzu
Pro zápis do kurzu se nejprve přihlašte a následně použijte tlačítko v přehledu kurzu.

Domácí projekty

Následující úkoly slouží k procvičení práce se slovníky.

0.

Napiš funkci mocniny, která pro argumentem zadané číslo n vytvoří a vrátí slovník, kde jako klíče budou čísla od jedné do n a jako hodnoty k nim jejich druhé mocniny.

Například: mocniny(4) vrátí {1: 1, 2: 4, 3: 9, 4: 16}

1.

Napiš proceduru, která vypíše obsah slovníku (klíče a k nim náležící hodnoty) na jednotlivé řádky.

Například vypis_slovnik(mocniny(4)) vypíše

Klíč 1, hodnota 1
Klíč 2, hodnota 4
Klíč 3, hodnota 9
Klíč 4, hodnota 16
2.

Na setkání jsme používali česko-anglický překladový slovník jako tenhle:

{'Jablko': 'Apple', 'Knoflík': 'Button', 'Myš': 'Mouse'}

Napiš funkci, která z česko-anglického slovníku (zadaného argumentem) vytvoří slovník anglicko-český. Můžeš předpokládat že se každý anglický termín ve slovníku vyskytuje max. jednou.

3.

Napiš funkci pocet_znaku, která jako argument dostane řetězec a vrátí slovník, ve kterém budou jako klíče jednotlivé znaky ze zadaného řetězce a jako hodnoty počty výskytů těchto znaků v řetězci.

Například: pocet_znaku("hello world") vrátí {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

Další úkol kombinuje slovníky se soubory.

4.

Napiš program, který vypíše básničku ze souboru basnicka.txt, ale každé písmeno nahradí jiným podle následujícího slovníku:

{'a': 'ɐ', 'b': 'q', 'c': 'ɔ', 'd': 'p', 'e': 'ǝ', 'f': 'ɟ', 'g': 'ƃ',
 'h': 'ɥ', 'i': 'ᴉ', 'j': 'ɾ', 'k': 'ʞ', 'l': 'l', 'm': 'ɯ', 'n': 'u',
 'o': 'o', 'p': 'd', 'q': 'b', 'r': 'ɹ', 's': 's', 't': 'ʇ', 'u': 'n',
 'v': 'ʌ', 'w': 'ʍ', 'x': 'x', 'y': 'ʎ', 'z': 'z', 'A': '∀', 'B': 'B',
 'C': 'Ɔ', 'D': 'D', 'E': 'Ǝ', 'F': 'Ⅎ', 'G': 'פ', 'H': 'H', 'I': 'I',
 'J': 'ſ', 'K': 'ʞ', 'L': '˥', 'M': 'W', 'N': 'N', 'O': 'O', 'P': 'Ԁ',
 'Q': 'Q', 'R': 'R', 'S': 'S', 'T': '┴', 'U': '∩', 'V': 'Λ', 'W': 'M',
 'X': 'X', 'Y': '⅄', 'Z': 'Z', '0': '0', '1': 'Ɩ', '2': 'ᄅ', '3': 'Ɛ',
 '4': 'ㄣ', '5': 'ϛ', '6': '9', '7': 'ㄥ', '8': '8', '9': '6', ',': "'",
 '.': '˙', '?': '¿', '!': '¡', '"': '„', "'": ',', '`': ',', '(': ')',
 ')': '(', '[': ']', ']': '[', '{': '}', '}': '{', '<': '>', '>': '<',
 '&': '⅋', '_': '‾'}

Znaky, které ve slovníku nejsou, program vypíše nezměněné.

Nepovinný bonus: Každý řádek navíc vypiš pozpátku (od posledního písmena). (Který typ sekvencí umíte obrátit?)

Využij soubory a formát JSON pro ukládání informací v programech, které už máš hotové.

5.

Vyber si jednu hru, kterou už máte naprogramovanou: Piškvorky (jednodušší) nebo Šibenici (složitější).

Po každém tahu hru hráče ulož: stav hry převeď na JSON a uložte do souboru stav.json.

6.

Při spuštění programu načti uložený stav ze souboru. Tedy:

  • Na začátku hry:
  • Pokud existuje soubor stav.json:
    • přečti ho a nastav podle něj stav hry.
  • Jinak hru začni normálně.

Typicky „slovníková“ hra "Kdo, S kým, Co dělali".

"Standardní" verze:

Hra pro 3 a více hračů (více je lepší). Každý hráč dostane úzký pruh papíru a tužku. Pak se hráči posadí do kruhu tak, aby si neviděli do papíru a postupně píší odpovědi na otázky "Kdo?", "S kým?", "Co dělali?", "Kde?", "Kdy?", "Proč?" a to tak, že po každé napsané odpovědi se papírek ohne tak, aby nebyla odpověď vidět a předá se vedlejšímu hráči. Po dokončení všech otázak se přečtou všechny odpovědi z papírku jako věta.

8.

Úkolem je vytvořit známou dětskou hru „Kdo? S kým? Co dělali?“.

  1. Hra se hráče zeptá postupně na různé otázky, například „Kdo?“, „S kým?“, „Co dělali?“, „Kde?“, „Kdy?“, a nakonec „Proč?“, s tím, že mu umožní na jednu otázku odpovědět vícekrát a všechny odpovědi si uloží do slovníku, podobně jako jsme na lekci měli telefonní čísla přiřazená ke jménům, např:

    {
        'Kdo': ['Anče', 'Kuba', 'Hajnej'],
        'S kým': ['Hyacint', 'Rumburak', 'Blekota'],
        ...
    }
    

    Seznam otázek by mělo být možné změnit v kódu na jednom místě bez zásahu do logiky programu.

  2. Hra vytvoří nový slovník, ve kterém bude ke každé otázce přiřazena právě jedna náhodně vybraná odpověď.

    {
        'Kdo': 'Anče',
        'S kým': 'Hyacint',
        ...
    }
    
  3. Na závěr pak hra z takto vybraných odpovědí složí větu, kterou vypíše uživateli.

Doporučuji hru rozdělit do tří funkcí, aby hru šlo napsat takto:

vsechny_odpovedi = ziskej_odpovedi()
vybrane_odpovedi = vyber_odpovedi(vsechny_odpovedi)
vypis_vysledek(vybrane_odpovedi)
9.

Rozšiř předchozí hru o možnost uložit na konci hry slovník obsahující otázky a odpovědi do JSON souboru. Dále uprav program tak, aby naopak na začátku hry bylo možné (volitelně) tyto uložené odpovědi ve hře použít.

Tohle je nepovinný projekt, který ti může zabrat více času a řeš ho jen tehdy, pokud máš čas a chuť.

Už máš hotovo a chceš další výzvy? Máme tu pro tebe další nepovinné úkoly.

10.

V tomto úkolu si budeme hrát s Morseovou abecedou. Na začátku máš k dispozici slovník, který obsahuje znak latinské abecedy (v našem případě bez číslic a speciálních znaků) a k němu příslušný znak v Morseově abecedě jako kombinaci teček a čárek.

morseova_abeceda = {
    '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': '--..',
    }

Tvým úkolem je napsat program, který převede text do Morseovy abecedy. Jako oddělovač jednotlivých morseových znaků použij znak svislé čáry (|), kterou napíšeš pomocí ALT+124.

Můžeš použít jakýkoliv text. Pro začátek ti doporučuji použít text bez českých háčků a čárek. Např. "Ucim se programovaci jazyk Python."

Pokud budeš chtít, můžeš rozšířit svůj program tak, aby si poradil i háčky a čárkami.

11.

Program s Morseovou abecedou uprav tak, aby uměl převést Morseovu abecedu zpět na latinku.

Můžeš trénovat s touto zprávou:

zprava = "---|.--.|.-.|.-|...-|-..|..-|-..|---|-...|.-.|.-|.--.|.-.|.-|-.-.|."

A nakonec trochu netradiční úkol s funkcemi.

12.

Napiš program, který postupně načte od uživatele dvě čísla a jednoznakový řetězec – buď '+', '-', '*' nebo '/'. Program provede na číslech příslušnou operaci.

Tenhle úkol už jsi jednou dělal/a. Tentokrát ale pro výběr operace použij následující slovník funkcí:

def secti(a, b):
    return a + b
def odecti(a, b):
    return a - b
def vynasob(a, b):
    return a * b
def podel(a, b):
    return a / b

slovnik_operaci = {
    '+': secti,
    '-': odecti,
    '*': vynasob,
    '/': podel,
}

Hodnoty tohoto slovníku jsou funkce, takže výraz jako slovnik_operaci['+'] teď označuje funkci: dosadí se za něj funkce secti. Můžeš tedy např. zavolat slovnik_operaci['+'](3, 4).

Příklad použití programu (čísla za dvojtečkou doplnil uživatel):

První číslo: 123
Druhé číslo: 456
Operace: +
123 + 456 = 579