Autorské riešenie
[stiahni]

  • Počet riešiteľov: 3 / 4= 75%

  • Úspešnosť riešenia: 7.3 / 8= 92 %

Riešenie tejto úlohy pozostáva z dvoch častí:

  1. doplnenie 8. cifry kódu EAN-8,
  2. vytlačenie 8-ciferného kódu EAN-8 so zadaným zväčšením.

Osemciferný kód EAN-8 vypočítame vynásobením zadaného sedemciferného čísla číslom 10 a pripočítaním kontrolného súčtu sedemciferného čísla. Na výpočet kontrolného súčtu použijeme vlastnú funkciu (operáciu), ktorá 8.cifru určí ako doplnok do najbližieho násobku desiatky trojnásobku súčtu čísel na nepárnych pozíciach a súčtu čísel na párnych pozíciach. Procedúra skompletujKod a funkcia (operácia) kontrolnySucet môžu vyzerať, napr. takto:

viem skompletujKod :cislo
  urob "kod 10 * :cislo + (kontrolnySucet :cislo)
koniec

viem kontrolnySucet :cislo
  urobTu "ksucet 0
  opakuj 7 [
    ak2 mod počítadlo 2 = 1 [
      urobTu "nasobok 3
    ][
      urobTu "nasobok 1
    ]
    urobTu "ksucet :ksucet + :nasobok * (mod :cislo 10)
    urobTu "cislo div :cislo 10
  ]
  výsledok 10 - (mod :ksucet 10)
koniec

Na vyriešenie druhej časť úlohy využijeme údaje o kódovaní jednotlivých cifier 0 až 9 v šavej a pravej časti kódu a tiež kódovaní počiatočnej, strednej a koncovej zarážky. Tieto údaje sú uvedené v procedúre start, ktorá je v Imagine projekte ako súčasť zadania úlohy:

viem start
  
urob "cifraVlavo  [0001101 0011001 0010011 0111101 0100011
                     0110001 0101111 0111011 0110111 0001011]
  urob "cifraVpravo [1110010 1100110 1101100 1000010 1011100
                     1001110 1010000 1000100 1001000 1110100]
  urob "zarazka     [101 01010 101]
koniec

Na lepšie pochopenie princípu kódu EAN-8 nám pomôže aj obrázok 1 uvedený v zadaní úlohy:

čiarový kód EAN-8

Obr 1. Kód EAN-8 pre číslo 85812576 so zvýraznením jednotlivých čísel a zarážok.

Na vykreslenie čiaroveho kódu cifry alebo zarážky vytvoríme procedúru kresliCifru, ktorá môže vyzerať, napr. takto:

viem kresliCifru :bitovyRetazec :dlzkaCiary :sirkaCiary
  prePrvky "znak :bitovyRetazec [
    ak2 :znak=1 [
      nechFP "čierna
    ][
      nechFP "biela
    ]
    dopredu :dlzkaCiary
    dopredu -:dlzkaCiary
    peroHore
    vľavo 90
    dopredu :sirkaCiary
    vpravo 90
    peroDolu
  ]
koniec

Na vykreslenie celého čiarového kódu s 3 zarážkami a 8 ciframi a tiež s výpisom 8-ciferného čísla vytvoríme procedúra kresliKod, ktorá môže vyzerať, napr. takto:

viem kresliKod :dlzkaCiary :sirkaCiary
  peroDolu
  nechPísmo ![|Courier New| [(:sirkaCiary * 7 - 1) 400 0 0 1 238]]
  nechHp :sirkaCiary
  urobTu "koeficient 1 + :sirkaCiary / 10

  ;vykreslenie číselného kódu (záražka, 4 cifry, záražka, 4 cifry, záražka)
  kresliCifru (prvok 1 :zarazka) :dlzkaCiary * :koeficient :sirkaCiary
  opakuj 4 [
    urobTu "cifra (prvok počítadlo :kod)
    kresliCifru (prvok :cifra + 1 :cifraVlavo) :dlzkaCiary :sirkaCiary
  ]
  kresliCifru (prvok 2 :zarazka) :dlzkaCiary * :koeficient :sirkaCiary
  opakuj 4 [
    urobTu "cifra (prvok počítadlo + 4 :kod)
    kresliCifru (prvok :cifra + 1 :cifraVpravo) :dlzkaCiary :sirkaCiary
  ]
  kresliCifru (prvok 3 :zarazka) :dlzkaCiary*:koeficient :sirkaCiary

  ;výpis číselného kódu
  peroHore
  vpravo 90
  dopredu (3 + 4 * 7 + 5 + 4 * 7 + 3) * :sirkaCiary
  vľavo 90
  dopredu :dlzkaCiary * :koeficient
  vľavo 90
  dopredu 3 * :sirkaCiary
  vľavo 90
  text div :kod 10000
  vpravo 90
  dopredu (4 * 7 + 5) * :sirkaCiary
  vľavo 90
  text mod :kod 10000
koniec

Napokon vytvoríme hlavnú procedúru skompletujAVytlacKod volajúcu procedúry skompletujKod a kresliKod, ktorá môže vyzerať, napr. takto:

viem skompletujAVytlacKod
  skry
  skompletujKod kod7'hodnota
  kod8'nechHodnota :kod
  znova
  vľavo 180
  kresliKod 100 zvacsenie'hodnota
koniec

Táto súťažná úloha je zameraná na použitie stratégie riešenia rozlož problém do podproblémov, pochopenie princípu čiarových kódov (kódu EAN-8), prácu s procedúrami a funkciami (operáciami) s parametrami, zoznamami, použitie príkazov opakovania a vetvenia, použitie funkcii div a mod vo výpočtoch.

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

Do riešenia tejto úlohy pre kategóriu EXPERT sa zapojili 3 zo 4 tímov. Tímy JM&JM a ikztzu získali plný počet bodov. Celkový priemer úspešnosti odovzdaných riešení bol 7,3 bodu z maximálneho počtu 8 bodov (91,7% úspešnosť).

V jednom riešení autori nesprávne vykresľovali zväčšené kódy, kde sa nedodržali pomery medzi šírkou čiernych a bielych pásov.