Autorské riešenie
[stiahni]

Riešenie tejto úlohy pozostáva z dvoch častí. Najprv ukryjeme čierno-biely obrázok zo Stránky1 do farebného obrázka zo Stránky2 a výsledok zobrazíme na Stránke3. Potom zrekonštruujeme ukrytý obrázok zo Stránky3 a zobrazíme ho na Stránke4.

Začneme procedúrou skryObrazok, ktorá ukryje čierno-biely obrázok do farebného.

Základom procedúry je prechod cez každý bod stránok Stránka1, Stránka2 a Stránka3. Na prvej stránke je text alebo obrázok, ktorý budeme ukrývať do obrázku na druhej stránke. Výsledný obrázok budeme kresliť na tretiu stránku.

viem skryObrazok
  stranka1'k1'ph [
  opakuj (prvok 1 stranka1'velkost) [
   stranka1'k1'nechysur (1 - pocitadlo)
   stranka2'k1'nechysur (1 - pocitadlo)
   stranka3'k1'nechysur (1 - pocitadlo)
   opakuj ((prvok 2 stranka1'velkost)) [
    stranka1'k1'nechxsur (pocitadlo - 1)
    stranka2'k1'nechxsur (pocitadlo - 1)
    stranka3'k1'nechxsur (pocitadlo - 1)
   ]
  ]
  stranka1'k1'pd
koniec

Najdôležitejšie je uvedomiť si fakt, že každý bod obrazovky (pixel) je možné vyjadriť pomocou trojice [r b g], pričom každá zložka má hodnotu od 0 po 255 (záleží to od toho, koľko červenej, modrej a zelenej daný pixel obsahuje). Navyše, malú zmenu zložiek RGB modelu človek nie je schopný vidieť.

Informáciu o čierno-bielom obrázku si "zakódujeme" do prvej zložky modelu RGB farebného obrázku. Kedže ukrývame čierno-biely obrázok, stačí na jeho ukrytie jeden bit. Najpr zistíme, či r zložka farebného obrázka obsahuje párne alebo nepárne číslo. Ak je nepárne, odrátame jednotku, čím zmeníme posledný bit zložky r na 0. Do tohto bitu zakódujeme informáciu o čierno-bielom obrázku. Ak je príslušný pixel čierno-bieleho obrázka čierny, necháme 0, v opačnom prípade zmeníme posledný bit na 1.

Výsledná procedúra by mohla vyzerať takto:

viem skryObrazok
  stranka1'k1'ph
  opakuj (prvok 1 stranka1'velkost) [
   stranka1'k1'nechysur (1 - pocitadlo)
   stranka2'k1'nechysur (1 - pocitadlo)
   stranka3'k1'nechysur (1 - pocitadlo)
   opakuj ((prvok 2 stranka1'velkost)) [
    stranka1'k1'nechxsur (pocitadlo - 1)
    stranka2'k1'nechxsur (pocitadlo - 1)
    stranka3'k1'nechxsur (pocitadlo - 1)
    ak2 ((zvysok (prvok 1 prevedNaRGB stranka2'k1'farbaBodu) 2) = 1)[
     urobTu "posun 1
    ][
     urobTu "posun 0
    ]
    ak2 (prvok 1 prevedNaRGB stranka1'k1'farbaBodu=255)[
     urobTu "zmena 1
    ][
     urobTu "zmena 0
    ]
    urobTu "r ((prvok 1 prevedNaRGB stranka2'k1'farbaBodu) - :posun + :zmena)
    urobTu "g (prvok 2 prevedNaRGB stranka2'k1'farbaBodu)
    urobTu "b (prvok 3 prevedNaRGB stranka2'k1'farbaBodu)
    stranka3'k1'nechfp (zoznam :r :g :b)
    stranka3'k1'bod 1
   ]
  ]
  stranka1'k1'pd
koniec

Bez hlbšej analýzy uvedieme procedúru ukazObrazok, ktorá odkryje čierno-biely obrázok ukrytý vo farebnom obrázku. Pri odkrývaní môžeme použiť iba zakódovaný obrázok. Podstané je uvedomiť si, že párne číslo v zložke r zakódovaného obrázka znamená, že príslušný bod čierno-bieleho obrázka bol čieny, inak bol biely.

Procedúra by mohla vyzerať takto:

viem ukazObrazok
  opakuj (prvok 1 stranka3'velkost) [
   stranka4'k1'nechysur (1 - pocitadlo)
   stranka3'k1'nechysur (1 - pocitadlo)
   opakuj ((prvok 2 stranka3'velkost)) [
    stranka4'k1'nechxsur (pocitadlo - 1)
    stranka3'k1'nechxsur (pocitadlo - 1)
    ak2 ((zvysok (prvok 1 prevedNaRGB stranka3'k1'farbaBodu) 2) = 1)[
     urobTu "f 255
    ][
     urobTu "f 0
    ]
   stranka4'k1'nechfp (zoznam :f :f :f)
   stranka4'k1'bod 1
   ]
  ]
koniec

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

Jednou z chýb bolo nedokreslenie okrajov obrázka. Niektoré tímy nesprávne pochopili zadanie a vykresľovali obrázok na stránku 4 pomocou stránok 2 a 3. Ďalšou chybou bolo, že pri výskyte bielej farby na stránke 2 by sa v niektorých riešeniach zapísalo do jednej zo zložiek číslo väčšie ako 255.