1. Priebežný test z Programovania (1) v 2023 - variant C


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 prvky Pythonu, ktoré sme sa neučili v prvých 13. prednáškach. Svojim funkciám (oproti zadaniu) môžeš zmeniť mená parametrov.


  1. Napíš funkciu stvorkova(cislo, skupiny=4), ktorá prevedie zadané číslo do štvorkovej sústavy (vráti znakový reťazec), pričom vloží znak '_' medzi skupiny cifier zadanej veľkosti. Takéto skupiny cifier by sa mali tvoriť od konca reťazca. Napríklad:

    >>> stvorkova(654321)
        '21_3323_3301'
    >>> stvorkova(8888, 2)
        '2_02_23_20'
    

    Výsledok môžeš odkontrolovať štandardnou funkciou int, ktorá má druhý parameter číselnú sústavu, napríklad:

    >>> int('21_3323_3301', 4)
        654321
    

  1. Napíš funkciu vyhadzuj(zoznam), ktorý z daného zoznamu hodnôt vyhodí všetky tie, ktoré sa tam vyskytujú viac ako raz, Napríklad:

    >>> zoz = list('programujem python')
    >>> vyhadzuj(zoz)
    >>> zoz
        ['g', 'a', 'u', 'j', 'e', ' ', 'y', 't', 'h', 'n']
    >>> z = [1, 2, 3, (), (), 3, 2, 1]
    >>> vyhadzuj(z)
    >>> z
        []
    

  1. Nájdi najväčšie dve za sebou idúce šesťciferné prvočísla p1 a p2 (medzi nimi už nie je žiadne ďalšie), pre ktoré platí, že všetky cifry p1 sú rôzne od cifier p2. Ak by sme hľadali najväčšie trojciferné boli by to 599 a 601. Nájdené prvočísla priraď do premennej prvocisla2, napríklad takto:

    prvocisla2 = 599, 601
    

    Pre túto úlohu neodovzdávaj program, ale len dve hodnoty priradené do premennej.


  1. Rekurzívna funkcia rek() nakreslí rôzne veľké farebné obdĺžniky. Prerob túto funkciu tak, aby nekreslila obdĺžniky, ale zistila súčet obvodov všetkých obdĺžnikov podľa farieb. Funkcia by mala vrátiť n-ticu dvojíc (farba, celé číslo), ktoré zodpovedajú súčtom obvodov podľa jednotlivých farieb (dvojice môžu byť v ľubovoľnom poradí). Funkcia:

    farba = ('blue', 'red', 'yellow')
    
    def rek(x1, y1, x2, y2, d, f=0):
        if min(abs(x1-x2), abs(y1-y2)) > d:
            rek(x1, y1, x1+(x2-x1)//3, y1+(y2-y1)//3, d, f+1)
            rek(x2, y1, x2-(x2-x1)//2, y1+(y2-y1)//3, d, f+2)
            rek(x2, y2, x2-(x2-x1)//3, y2-(y2-y1)//2, d, f+3)
            rek(x1, y2, x1+(x2-x1)//2, y2-(y2-y1)//2, d, f+4)
        else:
            canvas.create_rectangle(x1, y1, x2, y2, fill=farba[f%len(farba)])
    

    Napríklad pre takéto volanie:

    rek(10, 20, 360, 250, 60)
    

    Výstup vašej funkcie by mohol vyzerať takto (toto nie je správny výsledok pre posledné volanie):

    (('blue', 10), ('red', 20), ('yellow', 30))
    

    Funkcia by mala správne fungovať aj pre iný počet farieb v premennej farba.


  1. Napíš funkciu vyrob(tab), ktorej vstupný parameter je zoznam znakových reťazcov. Funkcia tento jednorozmerný zoznam prerobí na dvojrozmernú tabuľku (zoznam zoznamov). Funkcia teda prerobí každý znakový reťazec na riadok znakov, pričom každý znak, ktorý je číslica, prerobí na celé číslo. Funkcia nič nevracia, ale len zmení obsah vstupného parametra. Napríklad:

    >>> vv = ['ab3', '', '724x']
    >>> vyrob(vv)
    >>> vv
        [['a', 'b', 3], [], [7, 2, 4, 'x']]
    

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ť:

# 1C. priebezny test 2023
# student: Janko Hrasko
# datum: 14.11.2023

zrejme ako študenta uvedieš svoje meno.