2. Priebežný test 2023 - variant D


Odovzdávaš len jeden skript test.py, v ktorom budú všetky tvoje riešenia úloh. V odovzdanom riešení nepoužívaj import a ani global. Svojim funkciám (oproti zadaniu) môžeš zmeniť mená parametrov.


  1. Napíš funkciu pozicie(tabulka), ktorá zo zadanej trojrozmernej tabuľky (zoznam zoznamov zoznamov, teda každý prvok tejto tabuľky je dvojrozmerná tabuľka) vytvorí slovník pozícií číselných hodnôt. Napríklad:

    >>> t = [[['a', 7], [8, ()]], [[], [None, 3.14], []]]
    >>> pozicie(t)
        {(0, 0, 1): 7, (0, 1, 0): 8, (1, 1, 1): 3.14}
    

    keďže

    >>> t[0][0][1]
        7
    >>> t[0][1][0]
        8
    >>> t[1][1][1]
        3.14
    

  1. Daná funkcia vlocka kreslí pomocou korytnačej grafiky rekurzívnu krivku. Táto krivka sa skladá z úsečiek rôznej celočíselnej dĺžky. Prepíš túto funkciu tak, aby namiesto kreslenia čiar vrátila slovník počtov dĺžok jednotlivých úsečiek (pre každú dĺžku úsečky si zaznačí počet jej výskytov v krivke). Samozrejme, že pritom nepoužiješ turtle:

    def vlocka(d, min=8):
        if d > min:
            for q, u in (.4, -60), (.3, 120), (.35, -60), (.25, 0):
                vlocka(int(q * d), min)
                t.rt(u)
        else:
            t.fd(d)
    

    Napríklad, by to malo fungovať takto:

    >>> t = vlocka(400)
    >>> t
        {4: 84, 3: 64, 2: 17, 7: 13, 8: 7, 6: 21, 5: 32}
    

    Teda, napríklad, čiara dĺžky 4 sa nakreslila 84-krát, dĺžky 8 7-krát.

    Uvedom si, že funkcia by mala správne fungovať aj pre viac spustení (nielen pre prvé, ktoré ti možno zmení nejakú globálnu premennú).


  1. V textovom súbore (napríklad 'dobs.txt') sú slová oddelené medzerami, prípadne koncami riadkov. Napíš funkciu daj_podobne(meno_suboru, slovo), ktorá v takomto súbore vyhľadá všetky slová, ktoré sú zložené z tých istých písmen, ako zadané slovo, prípadne obsahujú ešte nejaké písmeno navyše. Funkcia vráti množinu takýchto slov. Napríklad:

    >>> daj_podobne('dobs.txt', 'ab')
        {'ba', 'iba', 'babu', 'bat', 'bala', 'zaba', 'bab', 'oba', 'aby'}
    

  1. Dodefinuj metódy triedy:

    class Retazce:
        ...
    

    tak, aby fungovalo:

    >>> r = Retazce('Java', 'Python')   # ľubovoľne dlhá postupnosť reťazcov
    >>> [r, r]
        [('Java', 'Python'), ('Java', 'Python')]
    >>> r.hodnota
        ('Java', 'Python')
    >>> type(r.hodnota)
        <class 'tuple'>
    >>> r.hodnota = 'a', 'b', 'c'
        ...
        AttributeError: property 'hodnota' of 'Retazce' object has no setter
    >>> r1 = r + Retazce('c++')
    >>> r1.hodnota
        ('Java', 'Python', 'c++')
    >>> r + r
        ('Java', 'Python', 'Java', 'Python')
    

  1. Napíš funkciu sucty(*cisla), ktorá vráti zoznam súčtov cifier: prvý súčet všetkých prvých cifier, druhý súčet druhých, … Ak má niektoré z čísel menej cifier, ako ostatné, potom chýbajúce cifry (od začiatku) budeme považovať za 0. Napriklad:

    >>> sucty(1, 23, 456, 70)
        [4, 14, 10]
    >>> sucty(0, 0, 0, 0, 0, 0, 0, 0)
        [0]
    >>> sucty(5, 40, 300, 2000, 10000)
        [1, 2, 3, 4, 5]
    

  1. Napíš mapovaciu funkciu filtruj(postupnost, *podmienky), ktorá aplikuje jednotlivé podmienky (funkcie) na prvky zadanej postupnosti takto: ak je prvá podmienka pre daný prvok splnená, tak sa prvok objaví vo výsledku, inak skontroluje druhú podmienku, atď. Napríklad:

    >>> filtruj(range(1, 20), lambda x: x%2, lambda x: x%5<2)
        [1, 3, 5, 6, 7, 9, 10, 11, 13, 15, 16, 17, 19]
    >>> filtruj((2, 3, 5, 7, 11))   # prázdna postupnosť podmienok
        [2, 3, 5, 7, 11]
    >>> filtruj('I love Python', lambda x: x>'n', lambda x: x<'h')
        ['I', ' ', 'o', 'v', 'e', ' ', 'P', 'y', 't', 'o']
    


Riešenie odovzdaj v súbore test.py (môžeš si ho stiahnuť z L.I.S.T.u), pričom prvé tri riadky súboru budú obsahovať:

# 2D. priebezny test 2023
# student: Janko Hrasko
# datum: 12.12.2023

zrejme ako študenta uvedieš svoje meno.