Autorské riešenie
Ak máme odpovedať na otázku, akú výšku mal alebo bude mať bambus v nejaký deň svojho života, musíme zohľadniť dve veci:
Jedným z riešení tejto úlohy je simulovať rast bambusu, pričom budeme zohľadňovať aj jednotlivé strihania. Ak vieme, aká by mala byť výška bambusu v deň strihania, vieme povedať aj to, aká je po zostrihnutí. Simuláciu nemusíme robiť pre každý deň (vieme, že každý deň podrastie o 1 cm). Stačí simulovať výšku bambusu v dni, keď do rastu nejako zasiahneme, t.j. v dni strihania. Nezabudnime na prípady, ak by záhradník chcel skrátiť výšku bambusu o viac než je jeho celková výška. Keďže nevieme nič o tom, ako sa robot v danej situácii zachová, môžeme uvažovať dve reakcie a nasledovné riešenia:
alebo
alebo
Vo vašich riešeniach sme akceptovali ako správny každý z uvedených prístupov. Pozrime sa, ako by sa menila výška bambusu, ak
by sme mali napríklad takýto záznam o strihaniach V 0. deň sme bambus zasadili a jeho výška je teda 0 cm. V 5. deň by výška mala byť 5 cm. Keďže sme ho zostrihli o 3 cm, bude jeho výška len 2 cm. V 11. deň by mal bambus narásť do výšky 8 cm. Pokúsili sme sa ho zostrihnúť o 10 cm. Výsledkom je výška 0. Do 16. dňa bambus nerušene rastie a jeho výška v tento deň dosiahne 5 cm. Výsledné riešenie môže vyzerať nasledovne: # Python def vyska_bambusu(zaznamy, den): # nastavíme počiatočné hodnoty simulacie, v deň 0 je výška bambusu 0 cm vyska = 0 den_zasahu = 0 # test, ak chceme vedieť výšku pred zasadením if den <= 0: return 0 # postupne prechádzame jednotlivé záznamy o strihaní for zaznam in zaznamy: # otestujeme prípad, keď nás zaujúma den medzi dvoma strihaniami if den < zaznam[0]: return vyska + den - den_zasahu #k výške bambusu pripočítame to, čo narástol od posledného strihania vyska = vyska + zaznam[0] - den_zasahu den_zasahu = zaznam[0] # od výšky bambusu odpočítame o koľko ho robot skrátil vyska = vyska - zaznam[1] # ošetrime prípad, ak by po skrátení mala byť výška záporná if vyska < 0: vyska = 0 return vyska + den - den_zasahu V tomto riešení sme pokus o nadmerné skrátenie bambusu (viac ako je jeho aktuálna dĺžka) vyriešili tak, že sme dĺžku upravili na 0. V premennej vyska registrujeme aktuálnu výšku bambusu počas simulácie jeho rastu. Na začiatku je to 0 cm. V premennej den_zasahu si pamätáme ostatný deň, kedy sme do rastu bambusu nejako zasiahli (zasadili sme ho alebo ho zostrihli). Na začiatku je týmto dňom deň 0. Ošetrili sme aj situáciu, ak by sme chceli vedieť výšku bambusu pred jeho zasadením. V takomto prípade bude jeho výška 0. Postupne prechádzame záznamy o strihaniach a pre každý záznam upravíme výšku bambusu. Testujeme, či sme ešte neprekročili deň, v ktorý nás výška zaujíma. Ak áno, vrátime výšku zväčšenú o nárast od posledného zásahu. V opačnom prípade upravíme výšku bambusu a aktualizujeme premenné vyska a den_zasahu. Ak sme spracovali všetky záznamy o strihaniach, vrátime výšku upravenú o nárast od posledného zásahu. Vaše zaujímavé riešenia a najčastejšie chyby Až na pár prípadov ste úlohu riešili správne. Niektorí z vás zabudli uvažovať o prípade, ak sa pokúsime bambus skrátiť o viac ako je jeho dĺžka. V týchto prípadoch funkcia odpovedala zápornou výslednou dĺžkou. Viacerí z vás neefektívne simulovali rast bambusu. Buď ste použili dva cykly v sebe alebo ste vypočítavali výšku bambusu pre každý deň jeho rastu. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |