Autorské riešenie
[stiahni imp : py ]

  • Počet riešiteľov v :  7 / 8 = 87 %                       

  • Úspešnosť riešenia: 3,75 / 6 = 62,5 %                   

Ú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.