Autorské riešenie
[stiahni [imp][py]]

  • Počet riešiteľov: 8 / 10 = 80 %

  • Úspešnosť riešenia:  2,25 / 5 = 45 %

Riešenie úlohy pozostáva z dvoch častí: 

  1. vypočítame dlžku strany rovnostranného trojuholníka hornej časti presýpacích hodín pre hodnotu uplynutého času,
  2. vykreslíme presýpacie hodiny s rozmermi odpovedajúcimi uplynutému času.

Najprv vyriešíme prvú podúlohu. Na obrázku sú zachytené dve situácie. Hodiny vľavo sa budú ešte presypávať 60 minút a hodiny vpravo ešte x minút.

presypacky vypocet

Plochy horných trojuholníkov oboch hodín sú umerné času, za ktorý sa majú presýpať. Na základe toho platí vzťah:

Px / x = P60 / 60

Pre plochy rovnostranných trojuholníkov Px a P so stranami dx a d platí:

Px = dx2 · √3 / 4

P60 = d2 · √3 / 4

Po dosadení týchto vzťahov a po úprave dostaneme:

dx2 / x = d2 / 60

dx2 = d2 · x / 60

Podľa zadania hodiny ukazujú čas, ktorý uplynul, nie ktorý má ešte uplynúť. Preto posledný vzťah upravíme tak, aby tam vystupovala premenná t predstavujúca už uplynutý čas. Použijeme pri tom vzťah: x + t = 60, premennú dx nahradíme premennou dt a napokon po odmocnení dostaneme vzťah medzi uplynutým časom t a dlžkou strany dt vyfarbeného rovnostranného trojuholníka v hornej časti presýpacích hodín ukazujúcich čas t:

dt = d · √(1 - t / 60)

Druhou podúlohou je vykreslenie presýpacích hodín pre zadaný čas. Na prvom obrázku si môžme všimnúť určitú pravidelnosť pri zobrazení presýpacích hodín. Farebnému trojuholníku v hornej časti presýpacích hodín odpovedá rovnaký biely trojuholník v dolnej časti. Rovnako bielemu lichobežníku v hornej časti odpovedá farebný lichobežník v dolnej časti. Presýpacie hodiny s uvedeným časom vykreslíme pomocou 2 trojuholníkov v hornej a 2 trojuholníkov v dolnej časti nasledovným postupom:

  1. v hornej časti vykreslíme biely trojuholník s dĺžkou strany d

  2. v hornej časti vykreslíme farebný trojuholník s dĺžkou strany dt

  3. v dolnej časti vykreslíme farebný trojuholník s dĺžkou strany d

  4. v dolnej časti vykreslíme biely trojuholník s dĺžkou strany dt

presypacky 1. faza presypacky 2. faza presypacky 3. faza presypacky 4. faza  presypacky animácia
(pre opakované spustenie animácie občerstvite obsah stránky, napr. Ctrl+R, resp. F5)

Procedúry trojuholník (na vykreslenie rovnostranného trojuholníka so zadanou dĺžkou strany a zadanou farbou výplne), kresli (na vykreslenie celých presýpacích hodín) a hlavný program, môžu v jazyku Imagine Logo vyzerať napríklad takto:

;Imagine Logo

viem trojuholnik :dlzka :farba
  nechFv :farba
  polygon [
    opakuj 3 [
      dopredu :dlzka
      vľavo 120
    ]
  ]
koniec

viem kresli :dlzka :farba :minuty
  vpravo 30
  urobTu "dlzka2 :dlzka * sqrt (1 - :minuty / 60)
  trojuholnik :dlzka "biela
  trojuholnik :dlzka2 :farba
  vpravo 180
  trojuholnik :dlzka :farba
  trojuholnik :dlzka2 "biela
  vpravo 150
koniec

viem start
  píš "|Zadaj veľkosť presýpacích hodín (celé číslo > 0,         napr. 240)|
  urobTu "velkost čítajSlovo
  kým [:velkost <= 0][
    píš "|Zadaj veľkosť presýpacích hodín (celé číslo > 0,           napr. 240)|
    urobTu "velkost čítajSlovo
  ]

  píš "|Zadaj farbu presýpacích hodín (napr. červená, modrá,         zelená...)|
  urobTu "zafarbenie čítajSlovo

  píš "|Zadaj čas (celé číslo od 0 do 60, napr. 45)|
  urobTu "cas čítajSlovo
  kým [alebo :cas < 0 :cas > 60 ][
    píš "|Zadaj čas (celé číslo od 0 do 60, napr. 45)|
    urobTu "cas čítajSlovo
  ]

  kresli :velkost :zafarbenie :cas
koniec

 A riešenie úlohy v jazyku Python môže vyzerať napríklad takto:

#Python

import turtle
from math import sqrt

kor = turtle.Turtle()
plocha = turtle.Screen()

def trojuholnik(dlzka, farba):
    '''
    Nakresli trojuholnik so zadanou dlzkou strany a farbou vyplne

    :param dlzka: velkost strany trojuholnika
    :type dlzka: int
    :param farba: farba vyplne trojuholnika
    :type farba: str

    :rtype: None
    '''
    kor.fillcolor(farba)
    kor.begin_fill()
    for _ in range(3):
        kor.forward(dlzka)
        kor.left(120)
    kor.end_fill()

def kresli(dlzka, farba, minuty):
    '''
    Nakresli presypacie hodiny so zadanou dlzkou strany, farbou vyplne a zadanym casom v minutach

    :param dlzka: velkost strany presypacich hodin
    :type dlzka: int
    :param farba: farba vyplne presypacich hodin
    :type farba: str
    :param minuty: cas, ktory maju ukazovat presypacie hodiny
    :type minuty: int
    :rtype: None
    '''
    dlzka2 = dlzka * sqrt(1 - minuty / 60)
    kor.right(30)
    trojuholnik(dlzka, 'white')
    trojuholnik(dlzka2, farba)
    kor.right(180)
    trojuholnik(dlzka, farba)
    trojuholnik(dlzka2, 'white')
    kor.right(150)

if __name__ == "__main__":
    velkost = int(input('Zadaj veľkosť presýpacích hodín (celé číslo > 0, napr. 240): '))
    while (velkost <= 0):
        velkost = int(input('Zadaj veľkosť presýpacích hodín (celé číslo > 0, napr. 240): '))
    zafarbenie = input('Zadaj farbu presýpacích hodín (napr. red, blue, green ...): ')
    cas = int(input('Zadaj čas (celé číslo od 0 do 60, napr. 45): '))
    while (cas < 0) or (cas > 60) :
        cas = int(input('Zadaj čas (celé číslo od 0 do 60, napr. 45): '))
    kor.left(90)
    kresli(velkost, zafarbenie, cas)
    kor.right(90)

plocha.mainloop()

Riešenie úlohy v Pythone sa mierne líši od riešenia v Imagine Logo lebo v korytnačej grafike v Pythone je počiatočné natočenie korytnačky na východ a v Imagine Logo je to na sever.

Táto súťažná úloha je zameraná na použitie priamej úmery pri výpočte odpovedajúcej dĺžky strany rovnostranného trojuholníka, na precvičenie použitia procedúr s výstupom, resp. funkcií s parametrami, na precvičenie práce s príkazmi priradenia, opakovania a príkazov korytnačej grafiky.

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

Do riešenia tejto úlohy pre kategóriu EXPERT sa zapojilo 8 tímov. Žiaden tím nezískal plný počet bodov. Súťažiaci dosiahli priemerný počet bodov 2,25 z možných 5 bodov. Len jeden tím riešil úlohu v jazyku Python.

V riešeniach sme zaregistrovali nasledovné chyby:

  • zlá úvaha, že výška (nie plocha) trojuholníka je priamo úmerná uplynutému času,
  • neošetrenie zadania vstupného parametra - času v intervale <0, 60>
  • neuvedenie riešenia druhej časti úlohy - času, ktorý predstavuje situácia, keď výška úrovne piesku v hornej a dolnej časti presýpacích hodín je rovnaká,
  • používanie globálnych premenných namiesto lokálnych,
  • nedôsledná úprava kódu - neodsadené príkazy a viaceré príkazy v riadku v riešeniach Imagine Logo.