Slovníky  15. listopadu 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

Těchto pár úkolů 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á“ hříčka:

8.

Úkolem je vytvořit známou skautskou 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)

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

9.

Bonusový nepovinný úkol.

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