Autorské riešenie
[stiahni imp:]

  • Počet riešiteľov: 7 / 14 = 50 %                       

  • Úspešnosť riešenia: 3,29 / 5= 66 %                   

V úlohe ste mali naprogramovať procedúru zosvetli_fotku, ktorá zosvetlí fotografiu stratenej korytnačky. Tu je potrebné si uvedomiť, že nie každá farba fotografie sa dá zosvetliť. Napr. najsvetlejšiu farbu už niet ako zosvetliť.

Vo vzorovom riešení procedúra zosvetli_fotku na začiatku zavolá procedúru da_sa_zosvetlit, ktorá otestuje, či sa dá fotka zosvetliť. Fotka sa dá zosvetliť, ak sa dá zosvetliť každá z jej farieb.

V počítačovej grafike farby vznikajú zmiešaním červenej, zelenej a modrej farby, preto sa dá každá farba zakódovať trojprvkovým RGB (red-green-blue) zoznamom čísel. Napríklad biela farba má kód [255 255 255], a čierna [0 0 0]. Niektoré farby v Imagine logu majú svoje pomenovanie, napr. sivá. My však potrebujeme túto farbu upraviť na základe jej číselného vyjadrenia. Z pomenovania farby získame jej číselné vyjadrenie príkazom prevedNaRGB.

Na testovanie, či fotka neobsahuje príliš svetlý bod, ktorý by po zosvetlení o 10% mal kód farby väčší ako 255 vytvoríme procedúru da_sa_zosvetlit, ktorá postupne prejde celou fotkou rozmeru 100 x 100 bodov, a otestuje každý bod fotografie.

Čierno-biele farby, teda odtiene sivej, majú všetky tri číselné kódy trojprvkového zoznamu rovnaké. Preto stačí otestovať len prvé číslo v zozname číselného kódu bodu.

Postupne testujeme všetky body obrázka. Ak počas testovania nájdeme bod,  ktorý sa nedá zosvetliť, fotografia sa nedá zosvetliť. Výsledok procedúry je "nie a testovanie ukončíme. Ak sme počas testu nenašli žiaden bod, ktorý by sa nedal zosvetliť, výsledok procedúry je "ano.

viem da_sa_zosvetlit
  ph
  domov
  opakuj 100 [
    opakuj 100 [
      urob "bod PrevedNaRGB FarbaBodu
      urobTu "kod prvy :bod
      ak :kod * 1.1 > 255 [
        vysledok "nie
      ]
      do 1
    ]
    vz 100
    vp 90
    do 1
    vl 90
  ]

  vysledok "ano

koniec

Pred testom korytnačku umiestnime na východzí bod, ktorý je nastavený ako domovský stav, v našom prípade v ľavom dolnom rohu aktuálnej fotky.

Ak sa testovaním zistí, že každý bod fotky sa dá zosvetliť, procedúra zosvetli_fotku zabezpečí zosvetľovanie. Postupne prechádzame ešte raz po celelj fotke, 100-krát opakujeme po stľpcoch a po riadkoch zosvetlenie každého bodu o 10%. Novú farbu získame vynásobením aktuálnej farby (trojprvkového zoznamu) bodu číslom 1,1: urob "novaFarba 1.1 * PrevedNaRGB FarbaBodu.

Nastavíme farbu pera na novú farbu, nakreslíme zosvetlený bod s priemerom 1 a postupujeme na nasledujúci bod.

Ak výsledkom procedúry da_sa_zosvetlit je "nie", môžeme vypísať oznámenie, že fotka sa nedá zosvetliť.

;Imagine logo

viem zosvetli_fotku
  ak2 da_sa_zosvetlit [
  domov
    opakuj 100 [
      opakuj 100 [
        urob "novaFarba 1.1 * PrevedNaRGB FarbaBodu
        nechFp :novaFarba
        bod 1
        do 1
      ]
      vz 100
      vp 90
      do 1
      vl 90
    ]
  ][
    pis "|Neda sa zosvetlit|
  ]

koniec

Ešte je zaujímavý krajný prípad, keď na fotke je čierny bod s kódom [0 0 0]. Tento bod uvedeným spôsobom nedokážeme zosvetliť. Farba [0 0 0] pri násobení 1.1 bude stále [0 0 0], teda čierna.

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

Mnohí ste uvažovali tak, že pri zosvetľovaní fotografie ste testovali len ten bod, ktorý zosvetľujete. Ak sa dal zosvetliť, tak ste ho zosvetlili, a ak sa nedal, nechali ste mu pôvodnú farbu. Vtedy na zosvetlenie fotografie stačil len jeden prechod. Problémom je, že rôzne farby obrázka sa pri tomto postupe nahradia rovnakou farbou, takže strácame informáciu v obrázku.

Túto úlohu na maximálny počet bodov vyriešili tímy Elektronik a BonifacGroup, ale aj ďalšie riešenia boli šikovné, správne ste pochopili zadanie všetci.  Niektorí ste netestovali farbu bodu, či nie je už pôvodne biela, preto ste v ďalšom vybielili celú fotku. Veľmi pekne ste zvládli prácu so zoznamami.