Autorské riešenie
Úlohu je možné riešiť viacerými spôsobmi. Uvedieme jednu z možností. Riešenie úlohy rozdelíme na dve časti. Máme databázu chrupov zločincov a záhryz, teda údaje o chrupe podozrivého z miesta činu. Potrebujeme zistiť, či niektorý z chrupov v databáze zločincov môže byť chrupom podozrivého. Nemusíme uvažovať len presné zhody, lebo podozrivému mohol niektorý zo zubov medzičasom vypadnúť. Najprv vyriešime problém, ako porovnať chrup podozrivého s ľubovoľným chrupom. Opakovaným porovnávaním chrupu podozrivého s chrupmi zločincov nájdeme zločinca s najväčšou mierou zhody chrupu. Funkcia porovnaj porovná chrup podozrivého s chrupom zločinca. Postupne porovná všetky zodpovedajúce zuby v zozname chrupov a vráti mieru zhody. Hodnotu miery zhody na začiatku nastavíme na 0. Ak na príslušnom mieste v oboch zoznamoch je rovnaký stav, teda je zub alebo nie je zub, miery zhody zvýšime o 1. Ak na príslušnom mieste v chrupe zločinca je zub a podozrivý nemá zub, považujeme to za možnú (čiastočnú) zhodu, lebo medzitým mu ten zub mohol vypadnúť a mieru zhody zvýšime o 0,5. Ak na príslušnom mieste zločinec nemá zub a podozrivý má, znamená to, že podozrivý nie je v zozname zločincov, lebo podľa zadaných podmienok zub mu nemohol dorásť. Funkciu skončí a vráti mieru zhody 0. Procedúra porovnaj v Imagine môže vyzerať takto:
;Imagine
logo
viem porovnaj :podozrivy :zlocinec urobTu "zhoda 0 opakuj 32 [ urobTu "zubZlocinec prvok pocitadlo :zlocinec urobTu "zubPodozriveho prvok pocitadlo :podozrivy ak2 :zubZlocinec = :zubPodozriveho [ urobTu "zhoda :zhoda+1 ][ ak2 :zubZlocinec > :zubPodozriveho [ urobtu "zhoda :zhoda+0.5 ][ vysledok 0 ] ] ] vysledok :zhoda koniec Funkcia porovnaj v Pythone môže vyzerať takto:
;Python
def porovnaj(podozrivy, zlocinec): zhoda = 0 for i in range(32): if zlocinec[i] == podozrivy[i]: zhoda += 1 elif zlocinec[i] > podozrivy[i]: zhoda += 0.5 else: return 0 return zhoda V druhej časti riešenia pomocou funkcie (procedúry) najdi_pachatela porovnávame chrup podozrivého so všetkými chrupmi v databáze, a vyhodnotíme najväčšiu zhodu. Prejdeme zoznamom zločincov a pomocou procedúry/funkcie porovnaj získame aktuálnu zhodu s daným záznamom v databáze. Ak aktuálna zhoda je väčšia ako najlepšia doteraz nájdená, zapamätáme si ju a a aktuálneho zločinca. Riešenie v Imagine logu:
;Imagine
logo
viem najdi_pachatela :podozrivy urobTu "najlepsia_zhoda 0 urobTu "najpodobnejsi_zlocinec [] prePrvky "zlocinec :databaza [ urobtu "aktualna_zhoda porovnaj :zlocinec :podozrivy ak :aktualna_zhoda > :najlepsia_zhoda [ urobTu "najlepsia_zhoda :zhoda urobTu "najpodobnejsi_zlocinec :zlocinec ] ] vysledok :najpodobnejsi_zlocinec koniec Riešenie v Pythone: #Python def najdi_pachatela(podozrivy, zlocinci): najlepsia_zhoda = 0 najpodobnejsi_zlocinec = [] for zlocinec in zlocinci: aktualna_zhoda = porovnaj(podozrivy, zlocinci[poradie]) if aktualna_zhoda > najlepsia_zhoda: najlepsia_zhoda = aktualna_zhoda najpodobnejsi_zlocinec = zlocinec return najpodobnejsi_zlocinec Výsledkom je prázdny zoznam, ak sa podozrivý nenachádza v zozname zločincov alebo chrup zločinca s najpodobnejším chrupom.
Maximálna hodnota zhody môže byť 32, minimálna 16. Zhoda 16 je v prípade, ak zločinec v zozname mal všetky
zuby a podozrivý nemá už ani jeden. Vaše zaujímavé riešenia a najčastejšie chyby Túto úlohu väčšina z vás riešila čiastočne správne. Vyriešili ste prípad, keď je úplná zhoda, váš program dokáže nájsť páchateľa ak je chrup podozrivého presne zo zoznamu zločincov. Mali ste uvažovať aj s prípadmi, keď podozrivému už medzitým vypadol zub, alebo má viac zubov. V Pythone najkrajšie riešenie poslal tím Šedá eminencia dodekahedrónov, takmer dokonalé riešenie majú tímy Bojovník Macek a 9.A_Chalani. Pozitívne hodnotíme, že ste prehľadne písali kódy programov a uviedli ste aj komentáre. |
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |