Autorské riešenie
[stiahni]

kruhovy_kod

Ak chceme preskúmať platnosť náhodne vytvoreného kruhového kódu a vypočítať počet pracovníkov, ktorí upravovali pancier s týmto kruhovým kódom, mali by sme si uvedomiť nasledovné:

  • na začiatku stojí korytnačka vľavo od kruhového kódu vzdialená 50 bodov od stredu najbližšieho kruhu,
  • vzdialenosť stredov kruhov je 50 bodov,
  • ak je korytnačka nad niektorým z kruhov, farba bodu pod ňou je biela alebo čierna, ak je mimo kruhov, tak farba bodu pod ňou je belasá,
  • počet kruhov kódu nie je vopred určené číslo, ale sa mení pri každom vytvorenom kruhovom kóde,
  • kruhový kód sa postupne vytvára sprava doľava,
  • kruhový kód je platný, ak je párny počet čiernych kruhov,
  • v prvej miestnosti pracuje 1 pracovník, v ďalších 2, 4, 8, ... pracovníkov,
  • počet pracovníkov sa má vypísať len v prípade platného kódu.

Pri riešení úlohy postupujeme tak, že sa najskôr presunieme na pravú stranu kruhového kódu. Postupne s krokom 50 bodov prechádzame kruhovým kódom, kým nenarazíme opäť na belasú farbu bodu. Pri prechode budeme spočítavať čierne kruhy a na konci zistíme, či ich počet je párny. Počet pracovníkov vypočítame tak, že ku kruhom postupne sprava doľava priradíme čísla 1, 2, 4, 8 ... a spočítame len tie čísla, pri ktorých je čierny kruh. V prípade situácie na obrázku to bude 1+4+8+16=29 pracovníkov.

kruhovy_kod2

Výsledná procedúra over vyzerá nasledovne:

viem over1
 ;cislo ... pocet pracovnikov
 ;parita ... pocet kruhov
 ;nasobok ... mocniny 2, t.j. cisla 1, 2, 4, 8, ...
 urobTu "cislo 0
 urobTu "parita 0
 urobTu "nasobok 1
 do 50

 ;prejdenie z lavej na pravu stranu kruhoveho kodu
 kym [farbaBodu<>"belasa] [do 50]

 ;prejdenie vsetkymi bielymi a ciernymi kruhmi sprava dolava
 vl 180
 do 50
 kym [farbaBodu<>"belasa]
   [ak farbaBodu="cierna
      [urobTu "cislo :cislo+:nasobok
       urobTu "parita :parita+1]
    urobTu "nasobok :nasobok*2
    do 50]

 ;vypis platnosti kodu a poctu pracovnikov
 ak2 zvysok :parita 2=0
   [pis "|platny kod vyrobku|
    (pis "|pocet pracovnikov: | :cislo)]
   [pis "|neplatny kod vyrobku|]
koniec


Úlohu vieme vyriešiť aj pri prechádzaní zľava doprava. Využijeme pritom iný zápis súčtu, kde použijeme zátvorky a vynímanie čísla 2 pred zátvorku. Konkrétne súčet 1+4+8+16=29 alebo 16+8+4+1=29 vieme prepísať na (8+4+2).2+1. Ďalej tento zápis upravíme na (4+2+1).2.2+1 ... a nakoniec dostaneme (((1.2+1).2+1).2+0).2+1=29. Posledne uvedený zápis nám umožní prechádzať kruhmi zprava doľava a postupne vypočítať počet pracovníkov.

viem over2
 ;cislo ... pocet pracovnikov
 ;parita ... pocet kruhov
 urobTu "cislo 0
 urobTu "parita 0
 do 50

 ;prejdenie vsetkymi bielymi a ciernymi kruhmi zlava doprava
 kym [farbaBodu<>"belasa]
   [ak farbaBodu="cierna
      [urobTu "cislo 2*:cislo+1
       urobTu "parita :parita+1]
    ak farbaBodu="biela
      [urobTu "cislo 2*:cislo]
    do 50]

 ;vypis platnosti kodu a poctu pracovnikov
  ak2 zvysok :parita 2=0
   [pis "|platny kod vyrobku|
    (pis "|pocet pracovnikov: | :cislo)]
   [pis "|neplatny kod vyrobku|]
koniec

Táto úloha je zameraná na precvičenie kódovania informácií - kruhový kód, z ktorého vieme vypočítať ďalší údaj (počet pracovníkov). Rovnako vieme overiť jeho platnosť pomocou kontrolného súčtu, podobne ako pri čiarkovom kóde výrobkov. Uvedený postup výpočtu počtu pracovníkov úzko súvisí s prevodom čísel z dvojkovej do desiatkovej pozičnej sústavy.

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

Do riešenia úlohy sa pustilo len 5 tímov. Nedostatky, ktorých sme postrehli vo vašich riešeniach a naše odporúčania:

  • tri tímy zabudli uviesť komentár k riešeniu úlohy, ktorý sme vyžadovali pri tejto úlohe,
  • pri výpočte pracovníkov ste neuvažovali správne, okrem zdvojnásobovania ste použili aj delenie dvomi, čo neviedlo k správnemu riešeniu,
  • pri riešení úlohy ste niektorí prechádzali až trikrát kruhovým kódom, pričom na vyriešenie úlohy stačil aj jediný prechod,
  • pri výpočte ste použili cyklus s pevným počtom opakovaní, pričom počet kruhov v kóde nebol pevne určený,
  • pred cyklom ste zabudli nastaviť premennú na počiatočnú hodnotu (inicializovať premennú),
  • pre lepšiu prehľadnosť riešení, odporúčame, aby ste nepísali viacero príkazov na jeden riadok, ideálne je písať jeden príkaz na jeden riadok a rovnako môžte vložiť prázdne riadky medzi jednotlivé časti riešenia,
  • neodporúčame používať premenné typu :1, :2, lebo sa môžte pomýliť pri ich zápise, kde ich môžte zameniť s číslami 1, 2, ...