Autorské riešenie
[stiahni]

Korytnačky v Korytnačkove začali vyrábať náhrdelníky. Na ich výrobu používajú tri druhy kameňov - tvaru štvorca (s), obdĺžnika (o) a kruhu (k). Korytnačky, ktoré náhrdelníky vyrábajú, postupujú podľa návrhov, ktoré im posiela návrhár. Návrhár však nie je spokojný, pretože náhrdelníky vyzerajú inak ako si predstavoval.

Návrhár vo svojej práci najprv vymyslí vzor, ktorý sa na náhrdelníku bude opakovať, napr. [s, k, o]. Tento vzor zaznamená a ak má čas, doplní tento vzor o ďalšie kamene, napr. pridá ešte jeden štvorcový kameň a jeden kameň kruhového tvaru. Takto vznikne návrh [s, k, o, s, k], ktorý dostanú korytnačky, ktoré náhrdelníky vyrábajú. Korytnačky v návrhu nedokážu nájsť vzor. To je príčinou všetkých hádok medzi návrhárom a korytnačkami, ktoré náhrdelníky vyrábajú. Teda prvým problémom, ktorý potrebujeme vyriešiť je odhaliť v návrhu vzor. Tento podproblém je možné vyriešiť napr. takto:

urobTu "dlzkaVzoru 0
urobTu "pomocny bezPr :navrh
kym [zaroven prvy :pomocny <> prvy :navrh prazdny? :pomocny = "nie][
  urobTu "dlzkaVzoru pocitadlo
  urobTu "pomocny bezPr :pomocny
]
urobTu "dlzkaVzoru :dlzkaVzoru + 1

Na nasledujúcom obrázku je nakreslený návrh náhrdelníka a vzor, na základe ktorého návrh vznikol:

navrhvzor

Po odhalení vzoru v návrhu potrebujeme do návrhu doplniť potrebný počet kameňov. Do návrhu musíme postupne pridať :pocetKamenov - pocet :navrh kameňov. Kamene vo vzore sa budú na náhrdelníku opakovať. Ak by počet kameňov na náhrdelníku bol násobkom počtu kameňov vo vzore, riešenie by bolo jednoduché. Vydelili by sme počet kameňov náhrdelníka počtom kameňov vzoru, čím by sme zistili koľkokrát je potrebné zopakovať vzor. Situácia ale môže byť aj zložitejšia. V takom prípade využijeme dĺžku vzoru. Keďže náhrdelník reprezentujeme ako zoznam kameňov, kameň na pozícii i musí byť rovnaký ako kameň na pozícii i - :dlzkaVzoru. Táto myšlienka sa používa pri postupnom pridávaní kameňov do návrhu, teda pri vytváraní náhrdelníka. Časť programu, ktorá rieši práve opísaný problém môže vyzerať nasledovne:

urobTu "poc pocet :navrh
opakuj :pocetKamenov - pocet :navrh [
  urobTu "navrh vlozPo (prvok :poc + 1 - :dlzkaVzoru :navrh) :navrh
  urobTu "poc pocet :navrh
]

Výsledný program vznikne spojením predošlých častí kódu:

viem doplnDoNavrhu :navrh :pocetKamenov
  urobTu "dlzkaVzoru 0
  urobTu "pomocny bezPr :navrh
  kym [zaroven prvy :pomocny <> prvy :navrh prazdny? :pomocny = "nie][
    urobTu "pomocny bezPr :pomocny
    urobTu "dlzkaVzoru pocitadlo
  ]
  urobTu "dlzkaVzoru :dlzkaVzoru + 1
  urobTu "poc pocet :navrh
  opakuj :pocetKamenov - pocet :navrh [
    urobTu "navrh vlozPo (prvok :poc + 1 - :dlzkaVzoru :navrh) :navrh
    urobTu "poc pocet :navrh
  ]
koniec

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

Úlohu riešilo 5 tímov. Dva tímy vyriešili problém dopĺňania kameňov do návrhu, ale hľadanie vzoru v návrhu chýba. Ďalší súťažný tím takisto dopĺňal kamene do návrhu, ale správne vyriešil iba prípad, keď počet kameňov v náhrdelníku je násobkom počtu kameňov, ktoré obsahoval návrh od návrhára. Zvyšné dva tímy nedosiahli zisk ani jediného bodu.