Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 8 / 11 =  73 %                       

  • Úspešnosť riešenia: 3 / 6 = 50%                   

Úlohou bolo vytvoriť procedúru, ktorá dokáže určiť moment, v ktorom je nutné vypnúť vypúšťacie čerpadlo a zapnúť napúšťacie čerpadlo pre bazén. Vieme, že objem bazéna pred a po napúšťaní môže byť rôzny a tiež, že prietok vypúšťacieho a napúšťacieho čerpadla môže byť rôzny.

Na začiatku si musíme uvedomiť, aké rôzne situácie môžu nastať:

  • v bazéne je na začiatku tak veľa vody, že ju nestihneme vypustiť na požadovanú úroveň
  • v bazéne má byť na konci tak veľa vody, že ju nestihneme napustiť na požadovanú úroveň
  • vodu stihneme vypustiť skôr, ako bude nutné zapnúť napúšťanie
  • vodu stihneme vypustiť presne v momente, ako je nutné zapnúť napúšťanie
  • vodu stihneme nestihneme vymeniť celú, ale len jej časť
Prvý a druhý prípad znamenajú, že úloha nemá riešenie. Vybavme ich postupne.

V prvom prípade, máme na začiatku tak veľa vody v bazéne, alebo taký úzky prietok čerpadla, že vodu nestihenme vypustiť na požadovanú úroveň vody na konci. Vypočítame teda, na akú úroveň by sme sa dostali, ak by sme všetok čas venovali iba vypúšťaniu. Ak na konci stále zostane viac vody, ako požadujeme, vieme, že úloha nemá riešenie.

;Imagine logo

  ak :vodaZ-(:prietokVyp*:cas)>:vodaK [
   pis [Uloha nema riesenie]
   ukonci
   ]

V druhom prípade, máme na konci požiadavku na tak veľa vody v bazéne, alebo taký úzky prietok čerpadla, že vodu nestihenme napustiť na požadovanú úroveň vody na konci. Vypočítame teda, na akú úroveň by sme sa dostali, ak by sme všetok čas venovali iba napúšťaniu. Ak na konci stále budeme mať menej vody, ako požadujeme, vieme, že úloha nemá riešenie.

;Imagine logo

  ak :vodaZ+(:prietokNap*:cas)<:vodaK [
   pis [Uloha nema riesenie]
   ukonci
   ]

Tretí a štvrtý prípad vieme vybaviť naraz. Predstavme si, že stihneme vypustiť a napustiť všetku vodu v bazéne. Spočítame, ako dlho nám bude trvať vypúšťanie a napúšťanie celého bazénu. Potom si overíme, či to naozaj stihneme urobiť v zadanom čase. Ak áno, vypíšeme hodnotu kedy je nutné zapnúť napúšťacie čerpadlo.

;Imagine logo

  urobTu "vypust :vodaZ/:prietokVyp
  urobTu "napust :vodaK/:prietokNap
 
  pis [Pocet minut po ktorom zapneme napustaci ventil:]
  ak :vypust+:napust<=:cas [
   pis :cas-:napust
   ukonci
  ]

Posledný prípad je najnáročnejší. Najlepšie si ho ukážeme, keď použijeme rovnice lineárnych funkcií, ktorými si znázorníme vypúšťanie a napúšťanie bazéna. V bode, v ktorom sa tieto funkcie pretnú, je potom nutné vypnúť vypúšťacie čerpadlo a zapnúť napúšťacie čerpadlo.

napustanie bazena

 

Odvodením predpisov týchto funkcií a následným hľadaním ich prieniku dostaneme rovnicu jednoduchú rovnicu:

div class="code"> ;Imagine logo

  urobTu "citatel :vodaZ-:vodaK+(:prietokNap*:cas)
  urobTu "menovatel :prietokNap+:prietokVyp
  urobTu "priesecnik :citatel/:menovatel

Tým sme pokryli všetky potenciálne prípady. Celý kód v Imagine a Pythone vyzerá nasledovne.

;Imagine logo
viem vymenVodu :vodaZ :prietokVyp :vodaK :prietokNap :cas
  ak :vodaz-(:prietokVyp*:cas)>:vodaK [
   pis [Uloha nema riesenie]
   ukonci
   ]
 
  ak :vodaZ+(:prietokNap*:cas)<:vodaK [
   pis [Uloha nema riesenie]
   ukonci
   ]
 
  urobTu "vypust :vodaZ/:prietokVyp
  urobTu "napust :vodaK/:prietokNap
 
  pis [Pocet minut po ktorom zapneme napustaci ventil:]
  ak :vypust+:napust<=:cas [
   pis :cas-:napust
   ukonci
   ]
 
  urobTu "citatel :vodaZ-:vodaK+(:prietokNap*:cas)
  urobTu "menovatel :prietokNap+:prietokVyp
  urobTu "priesecnik :citatel/:menovatel
 
  pis :priesecnik
 
  koniec
Python
def vymenVodu(vodaZ, prietokVyp, vodaK, prietokNap, cas):
    if(vodaZ-(prietokVyp*cas) > vodaK):
        print("Uloha nema riesenie.")
    elif(vodaZ+(prietokNap*cas) < vodaK):
        print("Uloha nema riesenie.")
    elif(vodaZ/prietokVyp+vodaK/prietokNap <= cas):
        print('Napustaci ventil zapneme po'+repr(cas-vodaK/prietokNap)+'minutach.')
    else:
        citatel = vodaZ-vodaK+(prietokNap*cas)
        menovatel = prietokNap+prietokVyp
        print('Napustaci ventil zapneme po ' + repr(citatel/menovatel) + ' minutach.')

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

Najväčší problém robil riešiteľom posledný spomenutý prípad v riešení, čo bolo aj očakávané. Niektorí riešitelia úlohu zrejme nepochopili dobre, pretože za riešenie považovali iba tie prípady, v ktorých vieme vypustiť celý bazén a nie len jeho časť. Ďalším problémom bolo určenie prípadov, keď úloha nemá riešenie. Niektorí riešitelia napríklad uvádzali záporné čísla, prípadne časy, ktoré presahovali povolený časový rozsah, no neuviedli pri tom, že to je vlastne zlé, resp. nerealizovateľné riešenie. Niektorí riešitelia zvolili prístup v ktorom si najprv vyriešili problém s rozdielomm medzi objemom vody na konci a na začiatku a potom už riešili akoby redukovanú úlohu, v ktorej bol objem na konci aj na začiatku rovnaký.