Autorské riešenie
[stiahni]

Pri riešení úlohy použijeme údajový typ zoznam, v ktorom budú uložené hodnoty kariet jedného balíka. Pre určenie víťaza hry môžeme simulovať proces hry. Zoberieme prvú (vrchnú) kartu z prvého balíka a prvú (vrchnú) kartu z druhého balíka, porovnáme hodnoty týchto kariet a rozdiel pripíšeme na koniec balíka, v ktorom bola karta s vyššou hodnotou. Obe vrchné karty zahodíme, t. j. skrátime obidva zoznamy o ich prvé prvky. Tento postup budeme opakovať dovtedy, až kým nenastane situácia, že aspoň jeden z balíkov bude prázdny. Riešenie úlohy môže vysledovať nasledovne:

viem zisti :a :b
  kým [zároveň počet :a<>0 počet :b<>0] [
    urobTu "vrchnaA prvy :a
    urobTu "a bezPr :a
    urobTu "vrchnaB prvy :b
    urobTu "b bezPr :b
    ak :vrchnaA>:vrchnaB [urobTu "a vlozPo :vrchnaA-:vrchnaB :a]
    ak :vrchnaA<:vrchnaB [urobTu "b vlozPo :vrchnaB-:vrchnaA :b]
  ]

  ak2 (zároveň počet :a=0 počet :b=0) [píš "remíza]
                                      [ak2 počet :b=0 [píš "|vyhral prvý hráč|]
                                                      [píš "|vyhral druhý hráč|]
  ]
koniec

V tomto riešení sme mohli na otestovanie neprázdnosti zoznamu použiť namiesto podmienky počet :a<>0 podmienku prazdny? :a="nie.

Iné riešenie úlohy je založené na nasledovnej úvahe. Po každom otočení a porovaní kariet klesne celkový súčet bodov v oboch balíkoch o rovnakú hodnotu. Pre výpočet víťaza stačí zistiť celkový súčet hodnôt kariet v balíkoch oboch hráčov. Vyhráva hráč, ktorého súče hodnôt kariet v balíku je väčší. Remíza nastáva ak sú obidva súčty rovnaké. Toto (viac matematické) riešenie úlohy môže vyzerať nasledovne:

viem zisti :a :b
  urobTu "sucetA 0
  prePrvky "i :a [
    urobTu "sucetA :sucetA+:i
  ]

  urobTu "sucetB 0
  prePrvky "i :b [
    urobTu "sucetB :sucetB+:i
  ]

  ak2 (zároveň :sucetA=:sucetB) [píš "remíza]
                                [ak2 :sucetA>:sucetB [píš "|vyhral prvý hráč|]
                                                     [píš "|vyhral druhý hráč|]
  ]
koniec

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

Úlohu riešilo 20 tímov. Vaše riešenia boli veľmi rôznorodé. Našli sa 3 rekurzívne riešenia úlohy podobné prvému autorskému riešeniu. Dva tímy súťažiacich vyriešili druhým uvedeným spôsobom.

Najčastejšie nedostatky, ktorých ste sa dopustili vo svojich riešeniach:

  • žiadne alebo nedôsledné ošetrenie remízového stavu,
  • nesprávne zadaná podmienka cyklu (v podmienke namiesto operátora zároveň bol uvedený operátor alebo; v podmienke sa testovala len neprázdnosť jedného zoznamu),
  • skracovanie oboch zoznamov ste uvádzali pri každej z troch podmienok pri rovnosti aj oboch nerovnosti porovnávaných vrchných kariet oboch zoznamov, stačilo to uviesť len raz za podmienkami;
  • namiesto dvoch vnorených podmeinených príkazoch AK2, ste použili tri za sebou idúce príkazy AK,
  • odporúčame čo najmenej používať globálne premenné (namiesto príkazu priradenia UROB používajte príkaz UROBTU, ktorým priraďujete hodnotu do lokálnej premennej),
  • väčšina súťažiacich nepoužívate prehľadný zápis programu, čo môže byť zdrojom chýb, skúste si pozrieť autorské riešenia tejto, či iných úloh, kde sa snažíme programy zapisovať tak, aby bolo jasné kde ktorý príkaz končí a príkazy rovnakej úrovne, aby boli odssadené pekne pod sebou.