Autorské riešenie
[stiahni]

  • počet riešiteľov: 10 / 23 = 43,5 %

  • Úspešnosť riešenia: 3,8 / 7 = 54,3 %

V tejto úlohe máme zobraziť skupiny čísel, ktoré predstavujú niečo neznáme čo chceme odhaliť. Vo všeobecnosti rovnako veľké skupiny čísel môžeme zobraziť ako obdĺžnikovú oblasť bodov rôznymi spôsobmi. Napr. údaje v ilustratívnom príklade

tajomna mapa - data

môžeme rozmiestniť po riadkoch alebo po stĺpcoch. Vypisovanie údajov v obdĺžnikovej oblasti môžeme začať v niektorom zo štyroch rohov obdlžníka.

tajomna mapa - zobrazenie dat

V riešení základnej úlohy budeme vykresľovať údaje po stĺpcoch zdola nahor a zľava doprava.

Pre vypísanie tajekto "obdĺžnikovej" skupiny čísel použijeme dva vnorené príkazy opakovania, napr. preČísla. Širku obdĺžnika určíme ako počet prvkov zoznamu "data a výšku ako počet prvkov prvého prvku zoznamu "data. Program na vypísanie čísel môže vyzerať napr. takto:

viem vypiš
  urobTu "šírka počet :data
  urobTu "výška počet prvý :data

  preČísla "i ![1 :šírka] [
    preČísla "j ![1 :výška] [
      nechXYsúr :i*30 :j*20
      text prvok :j prvok :i :data
    ]
  ]
koniec

V našej úlohe budeme namiesto čísel vykresľovať body s farbou určenou hodnotou čísel v zozname "data. Ak prečítame j-tý prvok z i-teho podzoznamu zoznamu "data, tak na pozíciu i-tý riadok a j-tý stĺpec zobrazíme bod s touto prečítanou hodnotou. Jeho farbu určíme určíme ako odtieň sivej farby, ktorá má všetky tri zložky R, G, B rovnaké. Program na vykreslenie tajomnej mapy po stĺpcoch v odtieňoch sivej môže vyzerať napr. takto:

viem kresli_graf
  urobTu "šírka počet :data
  urobTu "výška počet prvý :data

  preČísla "i ![1 :šírka] [
    preČísla "j ![1 :výška] [
      urobTu "odtieň prvok :j prvok :i :data       
      nechFarbaPera ![:odtieň :odtieň :odtieň]
      nechXYsúr :i :j
      bod 1      
    ]
  ]
koniec

Riešenie základnej úlohy zo zadania (bez kontroly vstupných hodnôt) dostaneme, ak v tomto programe doplníme parametre predstavujúce súradnice obrazovky, kde sa má vykresliť mapa a namiesto príkazu nechXYsúr :i :j uvedieme príkaz nechXYsúr :x_počiatok+:i :y_počiatok+:j.

viem kresli_graf :x_počiatok :y_počiatok
  urobTu "šírka počet :data
  urobTu "výška počet prvý :data

  preČísla "i ![1 :šírka] [
    preČísla "j ![1 :výška] [
      urobTu "odtieň prvok :j prvok :i :data       
      nechFarbaPera ![:odtieň :odtieň :odtieň]
      nechXYsúr :x_počiatok+:i :y_počiatok+:j
      bod 1      
    ]
  ]
koniec

Ak chceme vykresľovať mapu aj so zadaným zväčšením doplníme do procedúry kresli_graf ďalší parameter :zväčšenie a upravíme príkaz nastavujúci pozíciu vykreslenia na nechXYsúr :x_počiatok+:i*:zväčšenie :y_počiatok+:j*:zväčšenie. A tiež namiesto príkazu bod 1 vytvoríme pomocnú procedúru kresli_bod na vykreslenie farebného bodu s patričným zväčšením:

viem kresli_graf:x_počiatok :y_počiatok :zväčšenie
  urobTu "šírka počet :data
  urobTu "výška počet prvý :data

  preČísla "i ![1 :šírka] [
    preČísla "j ![1 :výška] [
      urobTu "odtieň prvok :j prvok :i :data       
      nechFarbaPera ![:odtieň :odtieň :odtieň]
      nechXYsúr :x_počiatok+:i*:zväčšenie :y_počiatok+:j*:zväčšenie
      kresli_bod      
    ]
  ]
koniec

viem kresli_bod
  polygón [
    opakuj 4 [
      dopredu :zväčšenie
      vpravo 90
    ]
  ]
koniec

Napokon vytvoríme riešenie úlohy, v ktorom doplníme parametre obdĺžnikového výrezu mapy :x1 :y1 :x2 :y2, parametre vodorovného aj zvislého zväčšenia bodu vykresľovania :x_zväčšenie :y_zväčšenie a ošetríme vstupné hodnoty parametrov, aby sa dala zadaná časť mapy vykresliť na danú stránku.

viem kresli_graf :x_počiatok :y_počiatok :x1 :y1 :x2 :y2 :x_zväčšenie :y_zväčšenie

  ; výpočet rozmerov mapy a kontrola správnosti parametrov
  ; nastavenie oblasti celej mapy pri zadaní parametrov x2=0 y2=0
  urobTu "šírka počet :data
  urobTu "výška počet prvý :data

  ak (zároveň :x2=0 :y2=0) [
    urobTu "x1 1
    urobTu "y1 1
    urobTu "x2 :šírka
    urobTu "y2 :výška
  ]

  ak (alebo
    :x1>:šírka :x2>:šírka :x1<1 :x2<1 :x2<=:x1
    :y1>:výška :y2>:výška :y1<1 :y2<1 :y2<=:y1
    (:x2-:x1)*:x_zväčšenie>(397-:x_počiatok)
    (:y2-:y1)*:y_zväčšenie>(249-:y_počiatok) ) [
    píš [Nesprávne uvedené parametre]
    ;píš (otázka "|Nesprávne uvedené parametre| "|Chybové hlásenie| 0)
    ukonči
  ]

  ; vykreslenie výrezu mapy (x1,y1)-(x2,y2) na súradnice (x_počiatok,y_počiatok) s daným zväčšením
  preČísla "i ![:x1 :x2] [
    preČísla "j ![:y1 :y2] [
      urobTu "odtieň prvok :j prvok :i :data
      nechXYsúr :x_počiatok+(:i-:x1)*:x_zväčšenie :y_počiatok+(:j-:y1)*:y_zväčšenie
      nechFarbaPera ![:odtieň :odtieň :odtieň]
      kresli_bod
    ]
  ]
koniec

viem kresli_bod
  ; vykreslenie bodu, resp. obdĺžnikového polygónu
  polygón [
    opakuj 2 [
      dopredu :y_zväčšenie
      vpravo 90
      dopredu :x_zväčšenie
      vpravo 90
    ]
  ]
koniec

Program môžeme ešte vylepšiť, ak namiesto štandardných hodnôt rozmerov obrazovky s pravým horným rohom so súradnicami [397,249], uvedieme výrazy pre všeobecné rozmery obrazovky:
(:x2-:x1)*:zväčšenie>(zaokruhli (prvý Stránka1’veľkosť)/2-1-:x_počiatok)
(:y2-:y1)*:zväčšenie>(zaokruhli (posledný Stránka1’veľkosť)/2-1-:y_počiatok)

Ďalším vylepšením riešenia tejto úlohy môže byť doplnenie ďalších troch parametrov určujúcich jeden z 8 možných smerov vykresľovania mapy (zdola zľava, zdola sprava, zhora zľava, zhora sprava, zľava zdola, zľava zhora, sprava zdola, sprava zhora). Iným diskutabilným vylepšením úlohy by bolo doplnenie uhla naklonenia vykreslenia mapy. Tu by sme sa museli vzdať absolútneho vykresľovania bodov pomocou karteziánskej sústavy (príkazy nechXYsúr, či nechPoz) a použiť výlučne príkazy korytnačej grafiky (dopredu, vpravo, ...).

Táto súťažná úloha je zameraná na použitie stratégií riešenia problémov - rozlož problém do podproblémov, nakresli si tabuľku, dôsledný rozbor možných prípadov riešenia úlohy, a tiež na výpočty s karteziánskymi súradnicami, použitie vnorených príkazov opakovania, vetvenia, zložených podmienok (so spojkami zároveň, alebo), údajového typu vnorený zoznam, nastavovanie farieb v modeli RGB. Riešenie tejto úlohy je ukážkou toho, ako sa dá naprogramovať nástroj na pomoc pri zisťovaní súvislosti v údajoch a pri ich vizualizácii.

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

Do riešenia tejto úlohy sa zapojilo 10 tímov. Len 1 tím vyriešil túto úlohu na plný počet 7 bodov - JM&JM, ktorým gratulujeme. Celkové priemerné skóre tejto úlohy bolo 3,8 bodu, čo je cca 54%.

V riiešeniach tejto úlohy sa vyskytli rôzne prístupy pri

  • spracovani zoznamu v premennej data:
    • v 2 riešeniach súťažiaci pracovali s kópiou zoznamu, v ktorom spracovávali stále prvý prvok zoznamu, pričom zoznam postupne zmenšovali o spracovaný prvok,
    • v ostatných 8 riešeniach súťažiaci pracovali priamo s premennou "data bez jej upravovania,
  • použití parametrov vykresľovacej procedúry:
    • len v 2 riešeniach neboli použité žiadne parametre,
    • v ostatných 8 riešeniach súťažiaci použili od 3 do 8 parametrov,
  • výbere smeru vykresľovania mapy:
    • väčšina zvolila smer zdola-nahor zľava-doprava (ako to bol uvedené v zadaní)
    • zopár súťažiacich si vybralo smer zľava-doprava zdola-nahor,
    • tím iktztu doplnil parametre pre vykresľovanie mapy 4 rôznymi smermi, za čo ich chválime,
  • vykresľovaní tvaru farebného bodu:
    • väčšina kreslila zväčšený farebný bod ako štvorec,
    • tím JM&JM ako obdĺžnik, za čo ich chválime,
    • 3 tímy použili tvar kruh,
  • zadávaní vstupných parametrov procedúry:
    • 8 súťažiacich nepoužilo žiadne vizuálne prvky,
    • 2 súťažiaci inside_studio a JM&JM použilo vlastné grafické prostredie so vsupnými poľami a posúvačmi pre zadanie parametrov procedúry, za čo ich chválime.

Nedostatky, ktoré sme našli v riešeniach súťažiacich:

  • nevyriešenie úlohy so všetkými požadovanými parametrami (počiatok, výsek, zoom),
  • neošetrenie vstupných parametrov (len 3 súťažiaci sa o to pokúsili, len 1 z nich to urobil dôsledne),
  • pri vykresľovaní zväčšených farebných bodov sa kurzor posúval nie o veľkosť zväčšenia, ale len o 1 bod,
  • pri vykresľovaní ste použili príkaz domov, ktorý znemožní kreslenie na rôzne pozície a tým zovšeobecnenie riešenia,
  • pri vykresľovaní výrezy sa zbytočne vykresľovala celá mapa s vykresľovaním bodov mimo výrezu bielou farbou,
  • namiesto lokálnych premenných viacerí súťažiaci používali globálne premenné - dobrý programátor používa čo najmenej globálnych premenných (namiesto príkazu urob používajte príkaz urobTu).