2.3.1 Cvičné úlohy pre MicroPython
Jednoduché úlohy s premennými a textami
Úloha 1: Žonglérska matematika dona Bosca
Kontext: Don Bosco chce v oratóriu ohúriť chlapcov žonglovaním. Má v košíku určitý počet loptičiek. Potrebuje však vedieť, či mu nejaké zostanú, ak ich spravodlivo rozdelí medzi svojich pomocníkov.
Zadanie:
-
Vytvor konštanty pre počet loptičiek (napr. 23) a pre počet chlapcov (napr. 5).
-
Vypočítaj a vypíš, koľko loptičiek dostane každý chlapec.
-
Vypočítaj a vypíš, koľko loptičiek zostane don Boscovi.
-
Pomocou mocniny vypočítaj, koľko loptičiek by mal don Bosco, keby mal „zázračný košík“, ktorý počet loptičiek umocní na druhú.
Strážny anjel (riešenie)
lopticky = const(23)
chlapci = const(5)
na_jedneho = lopticky // chlapci
zostalo = lopticky % chlapci
zazrak = lopticky ** 2
print(f"Každý chlapec dostane {na_jedneho} loptičiek.")
print(f"Donovi Boscovi zostalo v košíku {zostalo} loptičiek.")
print(f"Keby sa stal zázrak, mal by až {zazrak} loptičiek!")
Úloha 2: Apoštol dňa
Kontext: V saleziánskom stredisku chceme každé ráno vybrať jedného apoštola ako patróna dňa. Aby to bolo spravodlivé, necháme to na algoritmus.
Zadanie:
-
Vytvor zoznam apoštolov, ktorý obsahuje mená: Peter, Pavol, Jakub, Ján a Ondrej.
-
Náhodne vyber jedného apoštola.
-
Vypíš správu v tvare: „Dnešným patrónom je: MENO“, pričom meno musí byť veľkými písmenami.
-
Zisti a vypíš dĺžku mena vybraného apoštola.
Strážny anjel (riešenie)
from random import choice
# mená bez diakritiky kvôli obmedzeniu MicroPythonu
apostoli = ["Peter", "Pavol", "Jakub", "Jan", "Ondrej"]
vybrany = choice(apostoli)
print("Dnešným patrónom je:", vybrany.upper())
dlzka = len(vybrany)
if dlzka < 5: slovo = "písmená"
else: slovo = "písmen"
print(f"Jeho meno má {dlzka} {slovo}.")
Úloha 3: Trpezlivosť sv. Františka Saleského
Kontext: Svätý František Saleský (patrón saleziánov) bol známy svojou miernosťou. Povedal: „Jedna kvapka medu pritiahne viac múch než celý sud octu.“ Skúsme si jeho miernosť nacvičiť krátkym meditačným časovačom.
Zadanie:
- Program vypíše: „Miernosť je sila. Nádych...“
- Program počká presne 2,5 sekundy.
- Program vypíše: „...a výdych. Buďte dobrí ako don Bosco.“
- Zmeraj a vypíš, koľko milisekúnd reálne ubehlo medzi nádychom a výdychom.
Strážny anjel (riešenie)
from time import sleep, ticks_ms, ticks_diff
print("Miernosť je sila. Nádych...")
start = ticks_ms()
sleep(2.5)
print("...a výdych. Buďte dobrí ako don Bosco.")
koniec = ticks_ms()
trvanie = ticks_diff(koniec, start)
print(f"\nTvoja meditácia trvala presne {trvanie} ms.")
Úloha 4: Noemov popletený zoznam
Kontext: Noe si zaznamenal zoznam zvierat na archu, ale v tom zhone pred potopou to napísal dosť neporiadne. Potrebujeme ten text vyčistiť.
Zadanie:
- Máš záznam s textom „ hOLub, HavrAn, tiGer, zebrA “.
- Očisti text o biele znaky (medzery) na začiatku a konci.
- Preveď celý text na malé písmená.
- Nahraď všetky výskyty slova zebra slovom antilopa.
- Rozdeľ tento text na zoznam jednotlivých zvierat (podľa čiarky) a vypíš ho.
Strážny anjel (riešenie)
zaznam = " hOLub, HavrAn, tiGer, zebrA "
# 1. odstránenie medzier na krajoch
cisty = zaznam.strip()
# 2. prevod na malé písmená (funguje len pre ASCII bez diakritiky)
maly = cisty.lower()
# 3. nahradenie zvieratazvieraťa
opraveny = maly.replace("zebra", "antilopa")
# 4. rozdelenie na zoznam (list)
zoznam_zvierat = opraveny.split(", ")
print("Noe, tu je tvoj vyčistený zoznam:", zoznam_zvierat)
print("A viem ho vytvoriť aj na jeden krok:", end = " ")
print(zaznam.strip().lower().replace("zebra", "antilopa").split(", "))
Úloha 5: Unikátny kód oratória
Kontext: Chceme, aby sa každý mikrokontrolér v našom stredisku DOMKA vedel identifikovať unikátnym meno. Aby sme mali istotu, že každý bude mať iné meno, použijeme posledných 6 znakov z ID zariadenia.
Zadanie:
-
Získaj unikátne ID zariadenia.
-
Preveď toto binárne ID na čitateľný text (reťazec) v šestnástkovej sústave.
-
Z tohto textu získaj posledných 6 znakov.
-
Vytvor výsledné meno tak, že pred tieto znaky pridáš predponu „DOMKA-“.
-
Vypíš výsledok v tvare: „Moje meno je: DOMKA-1a2b3c“
Strážny anjel (riešenie)
from machine import unique_id
from binascii import hexlify
# 1. získanie surového ID (bytes)
raw_id = unique_id()
# 2. prevod na hexadecimálny reťazec (string)
hex_id = hexlify(raw_id).decode()
# 3. získanie posledných 6 znakov a pridanie predpony DOMKA
meno_zariadenia = "DOMKA-" + hex_id[-6:]
print("Moje meno je:", meno_zariadenia)
print("A jedným ťahom to je:", "DOMKA-" + hexlify(unique_id()).decode()[-6:])
Úlohy s podmienkami, cyklami a poľom údajov
Úloha 6: Spravodlivý hospodár
Kontext: V záhrade sa urodilo určité množstvo fíg. Don Bosco ich chce rozdeliť medzi chlapcov tak, aby každý dostal aspoň jednu. Ak je fíg málo, don Bosco sa svojej porcie vzdá.
Zadanie:
- Zo vstupu načítaj počet fíg a počet chlapcov.
- Ak je fíg viac ako chlapcov, vypíš: „Dnes máme hojnosť, vyjde každému!“
- Ak je fíg presne toľko ako chlapcov, vypíš: „Ujde sa každému chlapcovi, ale don Bosco bude dnes o hlade.“
- Ak je fíg menej ako chlapcov, vypíš: „Budeme sa musieť podeliť, nie je dosť pre všetkých.“
Strážny anjel (riešenie)
pocet_fig = input("počet fíg: ")
pocet_chlapcov = input("počet chlapcov: ")
if pocet_fig > pocet_chlapcov:
print("Dnes máme hojnosť, vyjde každému!")
elif pocet_fig == pocet_chlapcov:
print("Ujde sa každému chlapcovi, ale don Bosco bude dnes o hlade.")
else:
print("Budeme sa musieť podeliť, nie je dosť pre všetkých.")
Úloha 7: Jozefova dielňa
Kontext: Svätý Jozef pripravuje náradie v dielni. Má zoznam vecí, ktoré potrebuje na opravu stola, ale musí skontrolovať, či mu niečo nechýba.
Zadanie:
- Vytvor zoznam náradia, ktorý obsahuje: kladivo, píla, dláto, meter
- Pomocou cyklu prejdi celý zoznam a vypíš každé náradie v tvare: „Jozef berie do ruky: náradie“
- Ak narazíš na položku „píla“, vypíš k nej extra správu: „(Pozor, je ostrá!)“
Strážny anjel (riešenie)
naradie = ("kladivo", "píla", "dláto", "meter")
for n in naradie:
print("Jozef berie do ruky:", n)
if n == "píla":
print("(Pozor, je ostrá!)")
Úloha 8: Cesta do Betlehema
Kontext: Mária a Jozef putujú do Betlehema. Cesta je dlhá približne 150 kilometrov. Každým dňom prejdú približne 20 km cesty, až kým nedorazia do cieľa.
Zadanie:
-
Do premennej ulož celé číslo 150 ± 5 (náhodne).
-
Pomocou cyklu simuluj cestu: Kým ešte zostáva prejsť nejakú vzdialenosť, vypíš deň a koľko kilometrov zostáva.
-
Pozor na gramatiku:
-
Ak zostávajú 2, 3 alebo 4 km, vypíš: „V {?}. deň zostávajú {?} km...“
-
Pre ostatné počty vypíš: „V {?}. deň zostáva {?} km...“
-
-
Následne od tejto vzdialenosti odpočítaj 20 ± 5 km.
-
Keď prídu do cieľa, vypíš: „Mária a Jozef dorazili do Betlehema. Narodil sa Ježiško!“
Strážny anjel (riešenie)
from random import randint
vzdialenost = 150 + randint(-5, 5)
den = 1
while vzdialenost > 0:
if 2 <= vzdialenost <= 4: slovo = "zostávajú"
else: slovo = "zostáva"
print(f"V {den}. deň {slovo} {vzdialenost} km...")
vzdialenost -= 20 + randint(-5, 5)
den += 1
print("Mária a Jozef dorazili do Betlehema. Narodil sa Ježiško!")
Úloha 9: Skúška v rajskej záhrade
Kontext: Adam sa prechádza po rajskej záhrade a náhodne ochutnáva ovocie. Počas vychádzky by stihol ochutnať nanajvýš z 5 stromov. Ak počas týchto pokusov okúsi ovocie zo zakázaného stromu, bude vyhnaný. Ak vydrží všetky pokusy bez hriechu, obstál v skúške.
Zadanie:
- Vygeneruj náhodný počet ochutnávok (od 1 do 5).
- Vytvor zoznam stromov s rôznym ovocím, nezabudni doň zaradiť aj „strom poznania“.
- Podľa počtu ochutnávok opakuj náhodný výber stromu zo zoznamu.
- Ak je to strom poznania, vypíš varovanie: „Beda! Adam zahryzol do zakázaného ovocia!“ a okamžite ukonči program.
- Inak vypíš: „Adam ochutnáva ovocie zo stromu {názov stromu}.“
- Ak skúšku
zvládolzvládol, vypíš: „Skúška skončila. Adam odolal a zostáva v raji.“
Strážny anjel (riešenie)
from random import randint, choice
from time import sleep
pocet = randint(1, 5)
stromy = ("figovník", "olivovník", "jabloň", "strom poznania", "hruška", "granátovník")
print(f"--- Adam skúša šťastie {pocet}-krát ---")
for i in range(pocet):
sleep(1)
print(f"{i+1}. ochutnávka:", end = " ")
vybrany_strom = choice(stromy)
if vybrany_strom == "strom poznania":
print("Beda! Adam zahryzol do zakázaného ovocia!")
break
print(f"Adam ochutnáva ovocie zo stromu {vybrany_strom}.")
else:
# táto časť sa vykoná LEN vtedy, ak cyklus prebehol celý a nenarazil na break
print("Skúška skončila. Adam odolal a zostáva v raji.")
Úloha 10: Zázrak rozmnoženia
Kontext: Ježiš má na začiatku 5 chlebov. Simuluj zázrak, pri ktorom sa počet chlebov 3 až 7-krát po sebe zdvojnásobí.
Zadanie:
- Na úvod a po každom zdvojnásobení vypíš aktuálny počet chlebov.
- Po skončení celého procesu vypíš finálnu vetu o nasýtení zástupov s celkovým počtom chlebov.
Strážny anjel (riešenie)
from random import randint
from time import sleep
chleby = 5
print("Aktuálny počet chlebov:", chleby, end = "")
for _ in range(randint(3, 7)):
sleep(0.5)
print("\b" * len(str(chleby)), end = "")
chleby *= 2
print(chleby, end = "")
print(f"\nJežiš nasýtil zástupy, má až {chleby} chlebov!")
Úloha 11: Podiel na odmene
Kontext: V saleziánskom stredisku zbierajú chlapci body za dobré skutky. Na konci týždňa sa body sčítajú.
Zadanie:
- Máš zoznam bodov, ktoré získali piati chlapci: 12, 0, 8, 25, 3
- Prejdi tento zoznam a pre každú hodnotu rozhodni:
- Ak má chlapec viac ako 10 bodov, vypíš: „{?} bodov: Skvelá práca, máš nárok na sladkú odmenu!“
- Ak má chlapec aspoň 1 bod (ale nie viac ako 10), vypíš: „{?} bodov: Pekne si sa snažil, nabudúce to bude ešte lepšie.“ - pozor však na gramatiku!
- Ak nemá chlapec žiadny bod, vypíš: „0 bodov: Nevadí, don Bosco ti verí, že zajtra začneš nanovo!“
- Na úplný záver vypíš celkový súčet všetkých bodov v stredisku.
Strážny anjel (riešenie)
body_chlapcov = (12, 0, 8, 1, 3)
celkovo = 0
for b in body_chlapcov:
celkovo += b
if b > 10:
print(b, "bodov: Skvelá práca, máš nárok na sladkú odmenu!")
elif b >= 1:
if b == 1: slovo = "bod"
elif b <= 4: slovo = "body"
else: slovo = "bodov"
print(f"{b} {slovo}: Pekne si sa snažil, nabudúce to bude ešte lepšie.")
else:
print("0 bodov: Nevadí, don Bosco ti verí, že zajtra začneš nanovo!")
print("Celkový počet bodov v stredisku:", celkovo)
Úlohy s funkciami, lambdou a mapou
Úloha 12: Olej v lampách
Kontext: Päť múdrych panien si vzalo lampy a olej v nádobách. Potrebujeme funkciu, ktorá nám povie, či majú dosť oleja na celú noc.
Zadanie:
- Vytvor funkciu SkontrolujOlej, ktorá prijme jeden parameter: objem
- Funkcia vráti text:
- „Lampa svieti jasne.“, ak je objem aspoň 50 ml.
- „Plameň bliká, dolej olej!“, ak je objem menší ako 50 ml.
- V hlavnom programe zavolaj túto funkciu s rôznymi číslami a výsledok vypíš.
Strážny anjel (riešenie)
def SkontrolujOlej(objem):
if objem >= 50: return "Lampa svieti jasne."
return "Plameň bliká, dolej olej!"
# testovanie funkcie
p = 0
for objem in (100, 20, 50):
p += 1
print(f"Panna {p}, objem {objem}: {SkontrolujOlej(objem)}")
Úloha 13: Svadba v Káne Galilejskej
Kontext: Na svadbe chýba víno. Máme niekoľko nádob s vodou, ktoré sa premenia na víno. Potrebujeme vypočítať celkový objem.
Zadanie:
- Napíš funkciu PremenVodu, ktorá má dva parametre: pocet a objem.
- Funkcia vypočíta celkový objem a vráti výsledok.
- Ak nie je uvedený objem, nastav jeho predvolenú hodnotu na 40 litrov.
- Zavolaj funkciu tak, že určíš len počet nádob, a vypíš, koľko litrov vína vzniklo.
Strážny anjel (riešenie)
def PremenVodu(pocet, objem = 40):
return pocet * objem
pocet = const(6)
print("Zázrak sa stal! Máme", PremenVodu(pocet), "litrov najlepšieho vína.")
Úloha 14: Výkrik na púšti
Kontext: Ján Krstiteľ volá na púšti. Jeho hlas sa ozýva ako ozvena. Na tento krátky a rýchly výpis použijeme anonymnú funkciu.
Zadanie:
- Vytvor lambda funkciu Ozvena, ktorá prijme text a počet opakovaní a vráti text viackrát za sebou.
- Použi ju s textom „Pripravte cestu!“ s počtom opakovaní 3.
- Vypíš výsledok volania.
Strážny anjel (riešenie)
Ozvena = lambda text, pocet :pocet: " ".join((text, ) * pocet)
print(Ozvena("Pripravte cestu!", 3))
Úloha 15: Rybársky úlovok
Kontext: Apoštoli Peter a Ondrej vytiahli siete. V zozname majú váhu rýb v librách, ale my ich potrebujeme previesť na kilogramy (zjednodušene: 1 libra = 0,5 kg).
Zadanie:
- Vytvor náhodný zoznam hmotností rýb v librách - počet rýb nech je od 3 do 7 a ich hmotnosť od 1 do 5. Zoznam vypíš.
- Pomocou mapy a lambdy premeň všetky hodnoty na kilogramy a zaokrúhli ich na 2 desatinné miesta, aj tento zoznam vypíš.
- Pomocou ďalšej mapy a lambdy preveď každé číslo predošlého zoznamu na text s presne 2 desatinnými miestami, pridanou jednotkou „kg“ a desatinnou čiarkou namiesto bodky. Tento zoznam pospájaj bodkočiarkou a vypíš.
Strážny anjel (riešenie)
Pri tomto riešení si tvoj strážny anjel musel zájsť po radu až ku kráľovi Šalamúnovi - toto je už programátorská múdrosť najvyššieho kalibru!
from random import uniform, randint
# vygenerovanie náhodných úlovkov a zaokrúhlenie: využije generátor zoznamu cez for
vahy_libry = [round(uniform(1, 5), 2) for _ in range(randint(3, 7))]
print("Pôvodne zaznamenané váhy úlovkov v librách:", vahy_libry)
# prevod na kg a zaokrúhlenie: lambda berie váhu, premení a zaokrúhli
vahy_kg = tuple(map(lambda v: round(v * 0.5, 2), vahy_libry))
print("Váhy úlovkov v kilogramoch:", vahy_kg)
# pekný výpis s čiarkami a jednotkami, oddelené bodkočiarkou:
# lambda prevedie číslo na text, pridá "kg" a zmení bodku na čiarku
# map túto lambdu aplikuje na tuplu váh a join pospája
vahy = "; ".join(map(lambda v: f"{v:.2f} kg".replace(".", ","), vahy_kg))
print("Pekný zoznam váhy úlovkov v kilogramoch:", vahy)
x
Strážny anjel (riešenie)
x
x
Strážny anjel (riešenie)
x
x