Teoretický úvod
Toto cvičenie je malý príklad práce so štruktúrovaným textom. Diagram
záhona síce prichádza ako jeden reťazec, napríklad "VVCG\nVVRC", no znak
nového riadku v ňom oddeľuje dva riadky záhona. Po rozdelení získate dve
textové postupnosti, v ktorých každý znak predstavuje jedno políčko.
Úlohou je premeniť tri druhy informácie na výsledný zoznam:
- písmeno v diagrame → názov rastliny,
- poradie žiaka v abecednom zozname → dvojica stĺpcov,
- dvojica stĺpcov v oboch riadkoch → štyri rastliny daného žiaka.
Kľúčová je práca s indexmi. Indexovanie v Pythone začína od nuly. Ak má
žiak v zoradenom zozname index i, jeho políčka začínajú v stĺpci i * 2.
Každý žiak totiž zaberá presne dva stĺpce. Prvému žiakovi patria stĺpce 0 a 1,
druhému 2 a 3, tretiemu 4 a 5 atď. Dva susedné znaky pohodlne vyberiete
výrezom row[start:start + 2].
Diagram je usporiadaný po riadkoch, ale výsledok pre žiaka treba zostaviť z
jeho malého obdĺžnika: najprv dve rastliny z horného riadku a potom dve zo
spodného. Na preklad skratiek na názvy sa hodí slovník, napríklad
{"G": "Tráva", ...}. Slovník vyjadruje priamy vzťah „kód → hodnota“ a
umožní preložiť každý vybraný znak bez série podmienok if.
Cieľ cvičenia
V súbore kindergarten_garden.py implementujte triedu Garden. Trieda má
reprezentovať záhon v materskej škole a metóda plants() má vrátiť rastliny,
ktoré patria konkrétnemu žiakovi.
Použitie triedy vyzerá napríklad takto:
garden = Garden("RC\nGG")
garden.plants("Alena")
# ["Reďkovky", "Ďatelina", "Tráva", "Tráva"]
Konštruktor prijíma diagram záhona a voliteľne aj zoznam žiakov:
Garden(diagram, students=["Alena", "Boris"])
Ak zoznam žiakov nie je zadaný, použite štandardné mená Alena, Boris,
Cyril, Daniel, Eva, František, Gitka, Helena, Ivana, Jozef,
Karol a Ladislav.
Ako záhon funguje
Diagram má dva riadky. Každý žiak dostane štyri susediace políčka: dve políčka v hornom riadku a dve políčka v dolnom riadku.
Napríklad diagram:
VVCG
VVRC
je rozdelený takto:
VV CG
VV RC
Prvý žiak dostane prvé dva stĺpce (VV a VV) a druhý žiak ďalšie dva
stĺpce (CG a RC). Rastliny treba čítať zľava doprava: najprv dve horné
a potom dve dolné políčka.
Druhy rastlín
Každé písmeno v diagrame označuje jednu rastlinu:
| Písmeno | Rastlina |
|---|---|
G |
Tráva |
C |
Ďatelina |
R |
Reďkovky |
V |
Fialky |
Metóda plants(student) má vracať slovenské názvy rastlín, pretože práve tie
kontrolujú testy.
Príklad
Pre záhon:
garden = Garden("RC\nGG")
má Alena prvé dve políčka v oboch riadkoch:
R C
G G
Preto:
garden.plants("Alena")
# ["Reďkovky", "Ďatelina", "Tráva", "Tráva"]
Pri väčšom diagrame sa žiaci priraďujú podľa abecedného poradia. Ak je
zadaný vlastný zoznam students, musí sa najprv zoradiť abecedne; poradie
vstupného zoznamu teda nemusí byť zoradené.
Neexistujúci žiak
Ak sa metóda plants(student) zavolá s menom, ktoré nie je v zozname žiakov
daného záhona, musí vyvolať výnimku NoSuchStudentException. Túto vlastnú
výnimku definujte v súbore kindergarten_garden.py.
Odporúčaný postup
- Rozdeľte diagram na dva riadky.
- Zoraďte zoznam žiakov podľa mena.
- Nájdite poradie požadovaného žiaka v zoradenom zozname.
- Pre jeho poradie vypočítajte začiatok dvojice stĺpcov:
poradie * 2. - Z oboch riadkov vyberte dva znaky patriace žiakovi.
- Preložte písmená
G,C,RaVna názvy rastlín a vráťte ich v poradí horný riadok, horný riadok, dolný riadok, dolný riadok.
Na rozdelenie diagramu môžete použiť napríklad:
rows = diagram.splitlines()
Ak je start začiatok žiakovej dvojice stĺpcov, výrez jedného riadku získate
ako row[start:start + 2].