Autorské riešenie
[stiahni]

Aby výsledné riešenie bolo prehľadné, rozdelíme si úlohu na menšie podproblémy.

Najzložitejšou časťou úlohy je nájdenie najlepšej a najhoršej známky zo všetkých známok, ktoré korytnačka dostala. Uvedieme procedúru na nájdenie pozície najlepšej známky, analogicky by sa postupovalo pri hľadaní najhoršej známky. Procedúra viem indexNajm :z vráti pozíciu najlepšej známky v zozname známok (index najmenšieho prvku v zozname), nie najlepšiu známku. Dôvod je ten, že použitím metódy bezPozicie vieme zo zadaného zoznamu jednoducho odstrániť prvok na zadanej pozícii, čo sa nám zíde neskôr. Prvá časť riešenia by teda mohla vyzerať takto:

viem indexNajm :z
  urobTu "min pr :z
  urobTu "idx 1
  prePrvky "x :z [
   ak :x < :min [
    urob "min :x
    urob "idx poc
   ]
  ]
  vysledok :idx
koniec

Procedúru viem indexNajv :z neuvádzame, pretože pochopením procedúry viem indexNajm :z ju každý čitateľ zvládne naprogramovať sám.

Ešte si pripravíme procedúru na vypočítanie priemeru, ktorú tiež budeme potrebovať. Procedúra viem priemer :z by mohla vyzerať takto:

viem priemer :z
  urobTu "sucet 0
  prePrvky "x :z [
   urob "sucet :sucet + :x
  ]
  vysledok :sucet/pocet :z
koniec

Nakoniec nám ostala hlavná procedúra viem znamka :z, v ktorej využijeme všetky procedúry, ktoré sme si pripravili vopred. Najprv vyhodíme zo zoznamu najlepšiu a najhoršiu známku. Využijeme procedúru bezPozicie, pričom pozíciu najlepšej, resp. najhoršej známky získame zavolaním príslušných procedúr. Najdôležitejšie je uvedomiť si, že nie je správne najprv zistiť pozíciu najlepšej a najhoršej známky a až potom ich vymazať zo zoznamu, pretože ak najprv vymažeme napr. najlepšiu známku, nájdený index najhoršej známky už nemusí byť správny. Zo zoznamu bez najlepšej a najhoršej známky potom vypočítame priemer zavolaním príslušnej procedúry a výsledok zaokrúhlime. Može sa stať, že v zozname sa nenachádza dostatočný počet prvkov na vykonanie všetkých operácií, túto situáciu sme ošetrili. Hlavná procedúra by mohla vyzerať takto:

viem znamka :z
  ak2 pocet :z > 2 [
   urobTu "z bezPozicie (indexNajv :z) :z
   urobTu "z bezPozicie (indexNajm :z) :z
   pis zaokruhli priemer :z
  ] [
   pis "malo_znamok
  ]
koniec

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

Pri tejto úlohe väčšina z riešiteľov zabudla zaokrúhliť priemer, aby výsledná známka bola celé číslo. Niektoré tímy mali problém nájsť najlepšiu a najhoršiu známku, iné to zvládli na výbornú. Použitie metódy bezVyskytov pri vyhadzovaní najlepšej a najhoršej známky nie je vhodné, pretože táto metóda zo zadaného zoznamu vyhodí všetky výskyty zadaného prvku zoznamu. Napríklad, bezVyskytov 1 [4 1 1 5 1 1 1 1] vráti zoznam [4 5].