Autorské riešenie
[stiahni imp : py]                                       

  • Počet riešiteľov: 3 / 4 = 75 %

  • Úspešnosť riešenia: 3,67 / 6 = 61 %

Našou úlohou je vyhodnotiť, či súťažiaci nespravil nepovolený ťah autíčkom. Podľa pravidiel súťaže musí platiť: "Pri novom ťahu sa autíčko môže dostať maximálne o jeden uzlový bod mimo, než kam by sa dostalo, ak by zopakovalo predchádzajúci pohyb." Pre kontrolu povolených ťahov nám teda stačí kontrolovať dvojice po sebe idúcich ťahov.

V zázname hry je každý ťah zaznamenaný ako zmena súradníc autíčka v štvorčekovej sieti. Prvé číslo v ťahu je zmena x-ovej súradnice, druhé číslo v ťahu je zmena y-ovej súradnice. Ak sa autíčko môže dostať maximálne o jeden uzlový bod mimo, než by sa dostalo pri zopakovaní predchádzajúceho ťahu, stačí nám skontrolovať rozdiel zmien súradníc dvoch po sebe idúcich ťahov. 

tah autickom

Na obrázku je jedna z možných situácií.

Červený ťah predstavuje zrealizovaný ťah a vieme ho popísať [3, 1]. Svetločervený ťah je zopakovaním predchádzajúceho červeného ťahu a vieme ho popísať rovnako ako červený ťah [3, 1]Modrý ťah je nový ťah a vieme ho popísať [2, 2].

Pozrime sa na to, ako sa líši zrealizovaný ťah od zopakovania predchádzajúceho. Z obrázka vidíme, že cieľ modrého ťahu je vzdialený jeden uzlový bod od cieľa, kam by sme sa dostali ak by sme zopakovali predchádzajúci ťah. Čo sa týka rozdielu súradníc:

rozdiel_x = |3 - 2| = 1
rozdiel_y = |1 - 2| = 1

Podobne by sme vedeli zistiť, aká zmena by nastala, ak by modrá šípka smerovala do hociktorého zo zelených bodov. Ak rozdiel zmien súradníc bude max 1, ťah je korektný.

Výsledný program môže vyzerať nasledovne:

; Imagine Logo
viem je_tah_ok :tah_stary :tah_novy
  urobTu "rozdiel_x abs (prvok 1 :tah_stary) - (prvok 1 :tah_novy)
  urobTu "rozdiel_y abs (prvok 2 :tah_stary) - (prvok 2 :tah_novy)
  vysledok zaroven :rozdiel_x <= 1 :rozdiel_y <= 1))
koniec

viem testuj_zaznam :zaznam
  ak prvok 1 :zaznam <> [0 0] [
    vysledok "nie
  ]
  opakuj (pocet :zaznam) - 1 [
    ak nieje je_tah_ok prvok pocitadlo :zaznam prvok pocitadlo + 1 :zaznam [
      vysledok "nie
    ]
  ]
  vysledok "ano
koniec

 

# Python
def je_tah_ok(tah_stary, tah_novy):
    rozdiel_x = abs(tah_stary[0] - tah_novy[0])
    rozdiel_y = abs(tah_stary[1] - tah_novy[1])
    return rozdiel_x <= 1 and rozdiel_y <= 1

def testuj_zaznam(zaznam):
    if zaznam[0] != [0, 0]:
        return False
    for i in range(len(zaznam) - 1):
        if not je_tah_ok(zaznam[i], zaznam[i + 1]):
            return False
    return True

Všimnime si ešte jednu vec. Záznam každého z pretekov začína ťahom [0, 0]. Aj toto je potrebné otestovať. Ak by tento údaj v zázname pretekov nebol, nevieme rozhodnúť či nasledujúci ťah autíčkom je korektný alebo nie.

Vaše zaujímavé riešenia a najčastejšie chyby

Úlohu ste pochopili správne a riešili ste to rôzne. Veľmi pekné riešenie odovzdal tím BonifacGroup a Bojovník Macek. Typická chyba bola, že ste zabudli na testovanie prvého záznamu [0, 0], čo bolo v zadaní podmienkou. Bez tohto prvého záznamu neviete vyhodnotiť zvyšok. Správne ale menej efektívne riešenie je aj to, ak ste urobili zoznam všetkých možných povolených uzlových bodov, a následne ste prehladávali, či nasledujúci ťah sa nachádza v tomto zozname. Ďakujeme, že ste písali prehľadné a štrukturované kódy aj s komentármi.