1. Priebežný test z Programovania (1) v 2024 - variant B¶
Odovzdávaš len jeden skript, napríklad s menom test.py
, v ktorom budú všetky tvoje riešenia úloh. V odovzdanom riešení nepoužívaj import
, global
, {}
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. Môžeš si zadefinovať pomocné funkcie.
Napíš funkciu
vloz(zoznam, n=1)
, ktorá dostane ako parameterzoznam
celých čísel. Funkcia medzi každé dve čísla v zozname vloží nový prvok, ktorý je súčtom týchto čísel. Napríklad:>>> z = [1, 2, 5] >>> vloz(z) >>> z [1, 3, 2, 7, 5] >>> zoz = [1, 0] >>> vloz(zoz, 2) >>> zoz [1, 2, 1, 1, 0]
Parameter
n
označuje, koľkokrát sa toto vkladanie do zoznamu zopakuje. Funkcia nič nevypisuje ani nevracia. Výsledok bude v pôvodnom zozname.
Napíš funkciu
vyhodnot(retazec)
, ktorá dostane znakový reťazec s celými alebo desatinnými číslami, medzi ktorými môžu byť znamienka'+'
,'-'
,'*'
alebo'/'
. Funkcia vyhodnocuje tento výraz zľava doprava (bez ohľadu na priority operácií) a vráti hodnotu takéhoto aritmetického výrazu. Napríklad:>>> vyhodnot('0.31*1000+4/100') 3.14 >>> vyhodnot('25-3/7') 3.142857142857143
Skoro ľubovoľnú postupnosť nezáporných celých čísel
(p1, p2, p3, p4, ...)
vieme zakódovať do jedného celého čísla tak, že prvky postupnosti budú exponentmi pri súčine prvočísel, teda2**p1 * 3**p2 * 5**p3 * 7**p4 * ...
. Ak predpokladáme, že táto postupnosť nemá na konci nuly, tak sa dá jednoznačne spätne rozkódovať. Napíš funkciuvyrob_postupnost(cislo)
, ktorá dostáva jedno celé číslo, v ktorom je zakódovaná nejakú postupnosť a funkcia vráti práve túto postupnosť. Napríklad:>>> vyrob_postupnost(2**3 * 5**2 * 11**1) [3, 0, 2, 0, 1] >>> vyrob_postupnost(37**2) # 37 je prvocislo [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
Máme danú trojuholníkovú dvojrozmernú tabuľku čísel: v prvom riadku je
n
nejakých čísel, v druhomn-1
, atď. vn
-tom riadku je len jedno číslo. Napíš funkciusymetricka(tab)
, ktorá na začiatok každého riadku tabuľky (zrejme okrem prvého) doplní chýbajúce hodnoty tak, aby vznikla symetrická matica veľkostin
xn
, teda aby pre každý prvok takejto matice platilotab[i][j]==tab[j][i]
. Funkcia nič nevracia, len modifikuje vstupnú tabuľku. Napríklad:>>> t = [[1, 2, 3], [4, 5], [6]] >>> symetricka(t) >>> print(t) [[1, 2, 3], [2, 4, 5], [3, 5, 6]]
Na prednáške sa kreslila tzv. „Hilbertova krivka“ pomocou tejto rekurzívnej funkcie:
def hilbert(n, s, u=90): if n > 0: t.lt(u) hilbert(n - 1, s, -u) t.fd(s) t.rt(u) hilbert(n - 1, s, u) t.fd(s) hilbert(n - 1, s, u) t.rt(u) t.fd(s) hilbert(n - 1, s, -u) t.lt(u) t = turtle.Turtle() hilbert(3, 30)
Táto krivka sa skladá z úsečiek dĺžky
s
, pričom všetky sú rovnobežné s osoux
aleboy
, teda korytnačka prejde túto vzdialenosť buď smerom na východ alebo západ, alebo na sever alebo juh. Prepíš túto funkciu tak, že už nebude nič kresliť ale vráti dvojicu čísel, ktoré vyjadrujú celkové súčty úsečiek buď rovnobežné s osoux
aleboy
. Tieto dve hodnoty môžeš uviesť v ľubovoľnom poradí. Napríklad:>>> hilbert(3, 30) [930, 960]
Riešenia úloh odovzdaj v jednom súbore do testovacieho systému judge.ksp.sk,
pričom prvé tri riadky súboru budú obsahovať:
# 1B. priebezny test 2024
# student: Janko Hrasko
# datum: 12.11.2024
zrejme ako študenta uvedieš svoje meno.