Autorské riešenie
[stiahni]

Kvôli prehľadnosti riešenia sme sa rozhodli rozdeliť úlohu na menšie podúlohy.

Mayské číslice pozostávajú z čiar a bodov. Tie sú základom potrebným na vyriešenie tejto úlohy. Na kreslenie bodu nepotrebujeme samostatnú procedúru (je to iba jediný príkaz). Čiaru nakreslíme pomocou jednoduchej procedúry:

viem ciara
  nechHp 10
  do 100
  vz 100
  nechHp 1
koniec

Vykreslenie skupiny čiar zrealizuje nasledujúca procedúra (rozostup medzi čiarami sme si zvolili náhodne):

viem ciary :pocetCiar
  opakuj :pocetCiar [
    vp 90
    ciara
    vl 90
    ph
    do 20
    pd
  ]
koniec

V zadaní nie je určená dĺžka čiar a ani veľkosť bodov. Jediné, čo vieme je, že veľkosť bodu je dvojnásobkom hrúbky čiary. Veľkosť bodov závisí od nastavenia hrúbky čiar. Ak majú čiary hrúbku napr. 10, polomer bodu musí byť tiež 10 (a jeho priemer je potom 20). Zdá sa, že dĺžku čiary si môžeme zvoliť ľubovoľne. Ale je to naozaj tak?

Body, ktoré sa vykresľujú nad čiarami sa nesmú prekrývať, ani dotýkať, teda medzi bodmi musí byť medzera kladnej dĺžky. Navyše, body sa majú nachádzať nad čiarami, nesmú prečnievať. V prípade, že hrúbka čiary je 10, a teda bod má veľkosť 20, čiara nemôže mať dĺžku 80 (body by sa dotýkali), ani menej (body by sa prekrývali). Môžete si všimnúť, že my sme kreslili čiary dĺžky 100.

Pred vykreslením skupiny bodov musíme ešte vyriešiť ďalší problém - rovnomerné rozmiestnenie bodov nad čiarami. Všimnime si, že počet medzier je rovný počtu bodov + 1. Všetky medzery musia mať rovnakú dĺžku. Preto dĺžku jednej medzery vyrátame nasledujúcim spôsobom:

  urobTu "medzera (100 - (:pocetBodov * 20)) / (:pocetBodov + 1)

Na kreslenie bodov použijeme takúto procedúru:

viem body: pocetBodov
  vp 90
  urobTu "medzera (100 - (:pocetBodov * 20)) / (:pocetBodov + 1)
  ph
  do 10 + :medzera
  opakuj :pocetBodov [
    bod 20
    do 20 + :medzera
  ]
  pd
koniec

Čiara reprezentuje číslo 5, kým bod predstavuje číslo 1. Vypočítame, koľko čiar a koľko bodov bude obsahovať zadané číslo. Predtým si však uvedommne, že napr. pri kreslení čísla 8 nepoužijeme 8 bodov, ale 1 čiaru a 3 body. Teda, ak je to možné, nakreslíme čiaru, ak nie, začíname kresliť body. Počet čiar získame, ak celočíselne vydelíme vstupné číslo číslom 5. Počet bodov je potom zvyšok po delení zadaného čísla číslom 5.

Teraz už môžeme pristúpiť k procedúre, ktorá nakreslí číslo zadané na vstupe:

viem nakresliCislo :cislo
  urobTu "pocetCiar cpodiel :cislo 5
  urobTu "pocetBodov zvysok :cislo 5
  ciary :pocetCiar
  body :pocetBodov
koniec

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

Iba tím Baša a Saša získal plný počet bodov. Niekoľko tímov stratilo iba jediný bod, pretože zabudli testovať, či zadané číslo je zo stanoveného rozsahu. Veľmi častou chybou bolo nesprávne rozmiestnenie bodov. Hoci medzery medzi bodmi boli rovnaké, dĺžka úseku pred prvou bodkou a veľkosť úseku za poslednou bodkou nebola taká istá ako vzdialenosť medzi bodkami. Zaujímavé riešenie poslal tím Lupa. Dĺžku čiary menili podľa počtu bodiek, ktoré bolo potrebné vykresliť. Vyskytli sa i riešenia, ktoré každý prípad vyriešili samostatne (19 možností pre 19 čísel). Tieto riešenia považujeme za neefektívne. V praxi nie je možné ošetrovať každý prípad samostatne.