2. Priebežný test 2023 - variant B


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 z_pozicii(slovnik), ktorá zo zadaného slovníka pozícií vytvorí dvojrozmernú tabuľku minimálnych rozmerov. Kľúčami slovníka sú dvojice (riadok, stĺpec) a vyjadrujú pozíciu nejakej hodnoty v tabuľke. Takto nedefinované hodnoty budú mať hodnotu None. Napríklad:

    >>> sl = {(1, 3): 7, (0, 2): 'a', (2, 0): 3.14, (1, 1): 0}
    >>> tab = z_pozicii(sl)
    >>> print(*tab, sep='\n')
        [None, None, 'a', None]
        [None, 0, None, 7]
        [3.14, None, None, None]
    

  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 v jeho množine písmen jedno chýba. Funkcia vráti množinu takýchto slov. Napríklad:

    >>> daj_podobne('dobs.txt', 'desiata')
        {'desat', 'sadit', 'sediet', 'tesia', 'dietata', 'stastie', 'dieta'}
    

  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 maxima(*cisla), ktorá vráti zoznam maximálnych cifier: prvé číslo je maximálna prvá cifra, druhé maximálna druhá cifra, … Ak má niektoré z čísel menej cifier, ako ostatné, potom chýbajúce cifry (od začiatku) budeme považovať za 0. Napriklad:

    >>> maxima(162, 23, 416, 70)
        [4, 7, 6]
    >>> maxima(0, 0, 0, 0, 0, 0, 0, 0)
        [0]
    >>> maxima(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ť:

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

zrejme ako študenta uvedieš svoje meno.