Autorské riešenie
[stiahni]

Na vyriešenie tejto úlohy bolo potrebné zamyslieť sa nad dvoma dôležitými informáciami zo zadania:

(1) pre každý schod platí podmienka:

2 * výška schodu + šírka schodu = priemerný krok korytnačky,

(2) schodisko začína v ľavom dolnom rohu a končí v pravom hornom rohu miestnosti:

počet schodov * výška schodu = výška miestnosti,
počet schodov * šírka schodu = šírka miestnosti.

Miestnosť bola zobrazená z bočného pohľadu a jej rozmery sa dali meniť pomocou textových polí uvedených na obrazovke, pričom zo zadania platí, že rozmery môžu byť maximálne 250x200 bodov, aby sa nám celá dvojposchodová budova správne zobrazila na obrazovke.

Na to, aby sme vedeli pracovať s podmienkou

2 * výška schodu + šírka schodu = priemerný krok korytnačky,

si najprv vypočítame priemerný krok korytnačky ako aritmetický priemer troch hodnôt uvedených v zadaní:

   urobTu "muz 75
   urobTu "zena 60
   urobTu "dieta 54
   urobTu "priemer (:muz + :zena + :dieta)/3

Ak už máme hodnotu priemerného kroku, potrebujeme vhodne rozvrhnúť šírku a výšku jedného schodu. Z požiadavky (2) postupne platí:

počet schodov = šírka miestnosti / šírka schodu,
počet schodov = výška miestnosti / výška schodu.

Keďže počet schodov musí byť rovnaký, tak:

šírka miestnosti / šírka schodu = výška miestnosti / výška schodu

a teda úpravami:
šírka miestnosti / výška miestnosti = šírka schodu / výška schodu

Ak sa teda chceme dostať z ľavého dolného rohu miestnosti do pravého horného rohu miestnosti, tak musí platiť, že pomer šírky a výšky jedného schodu sa rovná pomeru šírky a výšky celej miestnosti (aby schody neskončili príliš skoro, prípadne neskončili príliš nízko ako to vidieť na nasledujúcom obrázku).

pomery

Pomer šírky a výšky miestnosti vypočítame:

   urobTu "pomer sirkaMiestnosti/vyskaMiestnosti

SirkaMiestnosti a vyskaMiestnosti sú názvy textových polí, v ktorých sú uložené rozmery miestnosti (podľa zadania maximálne 250x200 bodov).

A teraz môžeme prejsť na najdôležitejšiu časť. Postupným dosadením do nášho vzorca dostávame

2 * výška schodu + šírka schodu = priemerný krok korytnačky,
2 * výška schodu + pomer * výška schodu = priemerný krok korytnačky,
výška schodu * (2 + pomer) = priemerný krok korytnačky,
výška schodu = priemerný krok korytnačky / (2 + pomer) ,

čo v jazyku korytnačiek znamená:

   urobTu "vyska :priemer/(2+:pomer)

Ak už máme vypočítanú výšku, tak rovnako odvodením z nášho vzorca dostávame

2 * výška schodu + šírka schodu = priemerný krok korytnačky,
šírka schodu = priemerný krok korytnačky - (2 * výška schodu) ,

čo v jazyku korytnačiek znamená:

   urobTu "sirka :priemer - (2*:vyska)

Podarilo sa nám teda určiť také rozmery jedného schodu, ktoré vyhovujú pravidlu pri projektovaní schodiska a navyše je možné dostať sa z ľavého dolného rohu miestnosti do pravého horného rohu miestnosti. Výsledný počet schodov potom získame ľahko:

   urobTu "pocetSchodov sirkaMiestnosti/:sirka

Asi nás neprekvapí, že výsledok nemusí byť celé číslo. Porovnajme si napríklad výpočty:

I. prípad: Ak šírka miestnosti je 250 a výška miestnosti je 200, potom je výsledkom 10,3175 schodov.
II. prípad:Ak šírka miestnosti je 200 a výška miestnosti je 215, potom je výsledkom presne 10 schodov.

Ak by sme teda chceli dodržať všetky podmienky zadania, úloha v I. prípade nemá riešenie. V prvom prípade nemôže teda súčasne platiť podmienka pre šírku a výšku jedného schodu a zároveň platiť, aby schodisko začínalo v ľavom dolnom rohu a končilo v pravom hornom rohu.

Ak by sme však pripustili, že môže existovať ešte jeden (neúplný) schod, pre ktorý už nebude platiť predpísané pravidlo 2 * výška schodu + šírka schodu = priemerný krok korytnačky, tak v riešení by sme mohli pokračovať nasledovne: Zoberieme celú časť výsledku (až teraz pri poslednom schode!), ktorú vieme získať napríklad takto:

   urobTu "pocetSchodov cpodiel sirkaMiestnosti/:sirka*10 10

a neostáva nám nič iné, len rozmery posledného (neúplného) schodu dopočítať:

   urobTu "sirkax SirkaMiestnosti - (:pocetSchodov*:sirka)
   urobTu "vyskax VyskaMiestnosti - (:pocetSchodov*:vyska)

Na záver už len vykreslíme schody pomocou cyklu opakuj podľa vypočítaného počtu schodov a posledný schod prikreslíme, ako to už môžeme vidieť v hlavnej procedúre na nakreslenie celého schodiska, ktorá môže vyzerať nasledovne:

viem kresliSchodisko

   ; vypocet aritmetickeho priemeru a pomeru medzi vyskou a sirkou miestnosti
   urobTu "muz 75
   urobTu "zena 60
   urobTu "dieta 54
   urobTu "priemer (:muz + :zena + :dieta)/3
   urobTu "pomer sirkaMiestnosti/vyskaMiestnosti

   ; vypocet sirky a vysky jedneho schodu pomocou vzorca
   urobTu "vyska :priemer/(2+:pomer)
   urobTu "sirka :priemer - (2*:vyska)

   ; vypocet poctu schodov a vypis hodnot
   urobTu "pocetSchodov cpodiel sirkaMiestnosti/:sirka*10 10
   pis [Pocet schodov:]
   pis :pocetSchodov
   pis [Sirka schodu:]
   pis :sirka
   pis [Vyska schodu:]
   pis :vyska

   ; vykreslenie schodiska
   opakuj :pocetSchodov [
     vp 90
     do :sirka
     vl 90
     do :vyska
   ]

   ; doplnenie posledneho schodu
   urobTu "sirkax SirkaMiestnosti - (:pocetSchodov*:sirka)
   urobTu "vyskax VyskaMiestnosti - (:pocetSchodov*:vyska)
   vp 90
   do :sirkax
   vl 90
   do :vyskax

koniec

Ako výsledok dostaneme napríklad takéto vykreslenie:

schodisko

Vaše zaujímavé riešenia:

Objavilo sa niekoľko zaujímavých postupov, niektorí ste sa snažili začať kresliť prvý schod vo vhodnej vzdialenosti od ľavého dolného rohu tak, aby boli dodržané požadované podmienky, v inom riešení sa zase vyskytlo napríklad takéto testovanie:

   urobtu "PocetSchodov 1
   kym[nieje ((2 * :VyskaSchodu) + :SirkaSchodu) <= :PriemerKroku]
   [
   urobtu "VyskaSchodu vyskaMiestnosti / :PocetSchodov
   urobtu "SirkaSchodu sirkaMiestnosti / :PocetSchodov
   urobtu "PocetSchodov :PocetSchodov + 1
   ]

Toto riešenie (ako aj väčšina vašich riešení) však zlyháva na tom, že síce vyjadruje počet schodov ako celé číslo, ale vypočítaná šírka a výška jedného schodu už nespĺňa požadovanú podmienku: 2 * výška schodu + šírka schodu = priemerný krok. Inými slovami, toto riešenie funguje iba v takých prípadoch, ak vyskaMiestnosti / vyskaSchodu je celé číslo.

Ďalší nápad bol zameraný na testovanie, či nenarazím na stenu:

   kým[
     zároveň
       [k1'ysur+ vyskaSchodu <= vyskaMiestnosti-200]
       [k1'xsur+ sirka Schodu <= sirkaMiestnosti-150]
   ]
   [urobTu "pocetschodov :pocetschodov+1 schod]

V tomto riešení však procedúra na vykreslenie schodu nedodržiavala požadovanú podmienku pre priemerný krok a pozícia korytnačky je pevná na pozícii [-150 -200].

Najčastejšie chyby:

  • schodisko síce začínalo v ľavom dolnom rohu a končilo v pravom hornom, ale pre výšku a šírku jednotlivých schodov neplatila zadaná podmienka,
  • pre jednotlivé schody síce platila zadaná podmienka, ale schodisko nezačínalo v ľavom dolnom rohu, prípadne nekončilo v pravom hornom rohu,
  • výpočet fungoval len pre jeden prípad rozmerov miestnosti,
  • počet schodov ste najprv zaokrúhlili, až potom ste počítali šírku a výšku schodu,
  • chýbali komentáre na vysvetlenie postupu riešenia.