Autorské riešenie
[stiahni]

Na to, aby sme mohli povedať, že dané číslo môže byť platným korytnačím vodným číslom, musia byť splnené súčasne tri podmienky.

Prvou podmienkou je overenie deliteľnosti daného čísla číslom 9. Číslo uložené v premennej :x je deliteľné 9, ak zvyšok delenía premennej :x číslom 9 je 0. Na to v prostredí Imagine použijeme operáciu zvyšok, konkrétne výraz zvyšok :x 9 = 0.

Druhou podmienkou je overenie, či dané číslo sa rovnako píše odpredu aj zozadu. V prostredí Imagine na "prevrátenie čísla odzadu" použijeme operáciu prevráť. Druhú podmienku môžeme zapísať ako prevráť :x = :x.

Tretia podmienka overuje, či piata číslica 9-ciferného čísla nie je 9. Ak celočíselne vydelíme pôvodné 9-ciferné číslo číslom 10000, dostaneme 5-ciferné číslo obsahujúce prvých 5 číslic povôdného čísla. V prostredí Imagine na vyjadrenie celočíselného delenia použijeme operáciu cPodiel, konkrétne použijeme výraz cPodiel :x 10000. Napokon z daného 5-ciferného čísla potrebujeme overiť, či najpravejšia číslica nie je 9. Na to použijeme zvyšok pri delení číslom 10, konkrétne výraz zvyšok číslo 10 <> 9. Spojením oboch výrazov dostaneme výraz, ktorým overujeme, či prostredná (piata) číslica 9- ciferného čísla je rôzna od 9, konkrétne zvyšok (cPodiel :x 10000) 10 <> 9.

Zadané číslo je platným vodným číslom, ak sú splnené všetky z troch uvedených podmienok, čo dosiahneme pomocou operátora zároveň.

Výsledný program vyzerá nasledovne:

viem over :x
  ak2 (zároveň
          zvyšok :x 9 = 0
          prevráť :x = :x
          zvyšok (cPodiel :x 10000) 10 <> 9)
    [píš "platné]
    [píš "neplatné]
koniec

Niektorí riešitelia nepoznajú alebo nechcú použiť operáciu prevráť. Pre nich ponúkame nasledovné riešenie, ako z čísla uloženého v premennej :x vyrobíme "prevrátené" číslo :xp. Aby sme si zachovali neporušené pôvodné čsílo :x, odložíme si ho do premennej :xk, s ktorou budeme ďalej pracovať. Postupne budeme číslo :xk deliť číslom 10 a vyberať napravejšiu číslicu, ktorú budeme pridávať sprava k číslu :xp, ktoré budeme postupne násobiť číslom 10.

Výsledný program bude vyzerať nasledovne:

viem over :x
  urobTu "xk :x
  urobTu "xp 0

  kým [:xk > 0]
    [urobTu "cifra zvyšok :xk 10
     urobTu "xk cPodiel :xk 10
     urobTu "xp 10 * :xp + :cifra]

  ak2 (zároveň
          zvyšok :x 9 = 0
          :x = :xp
          zvyšok (cPodiel :x 10000) 10 <> 9)
    [pis "platné]
    [pis "neplatné]
koniec

Druhá verzia progamu je síce dlhšia, ale použiteľná aj v programovacích jazykoch, ktoré nepoznajú príkaz rovnocenný s príkazom prevráť.

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

Do riešenia úlohy sa pustilo 6 súťažiacich. Len jediný to zobral vážne s napísaním komentáru k úlohe, čím získal plný počet bodov. Riešenia súťažiacich boli veľmi rôznorodé, niektorí ste na výber jednotlivých číslic použili príkazy na prácu so slovami a zoznamami (prvy, posledny, prvok, bezpr, bezpo), jeden súťažiaci použil deväť vstupv na uľahčenie si riešenia úlohy. Na overenie platnosti troch podmienok zároveň ste namiesto logickej spojky zároveň použili vnorené príkazy vetvenia resp. príkazy ukonči.