Autorské riešenie
[stiahni]

Základom úspešného vyriešenia tejto úlohy je správne určiť rozdiel dvoch zadaných časov.

Najprv urobíme rozdiel sekúnd, minút a hodín zadaných na vstupe. Tento krok stačí na vyriešenie prvej časti úlohy, ak sekundy, minúty aj hodiny počiatočného času sú menšie než koncového, napr. ak počiatočný čas je 20:54:23 a koncový čas je 22:54:30. Prvá časť riešenia by teda mohla vyzerať takto:

viem vypocitajCas :h1 :m1 :s1 :h2 :m2 :s2
  urobTu "sek :s2 - :s1
  urobTu "min :m2 - :m1
  urobTu "hod :h2 - :h1
koniec

Čo ak vypočítaním rozdielu :s2 - :s1 dostaneme záporné číslo, čiže počet sekúnd je menej ako 0? Ako určíme rozdiel časov 19:27:51 a 21:46:34? K rozdielu sekúnd musíme pripočítať 60, keďže 1 minúta má 60 sekúnd. Navyše, počet minút musíme znížiť o 1. Procedúru doplníme napríklad takto:

ak :sek < 0 [
  urobTu "sek :sek + 60
  urobTu "min :min - 1
]

Ostalo ešte vyriešiť prípad, keď počet minút je menej ako 0. Situácia je rovnaká ako v prípade sekúnd. Procedúru rozšírime o nasledujúcu podmienku:

ak :min < 0 [
  urobTu "min :min + 60
  urobTu "hod :hod - 1
]

Ostáva vyriešiť situáciu, keď korytnačka začala riešiť úlohy programátorskej súťaže pred polnocou a skončila po polnoci. Inými slovami, potrebujeme ošetriť prípad, keď rozdiel hodín je menší než 0. Keďže 1 deň má 24 hodín, stačí k rozdielu pripočítať 24. Doplníme teda procedúru takto:

ak :hod < 0 [
  urobTu "hod :hod + 24
]

Ak korytnačka začne riešiť úlohy skôr než sa oficiálne začne súťaž (maximálne hodinu pred začiatkom) alebo svoje riešenie odovzdá po ukončení súťaže (maximálne hodinu po ukončení), je diskvalifikovaná. Prípustný čas pre začatie a odovzdanie riešenie je teda od 18:00:00 do 23:00:00 alebo od 00:00:00 do 6:00:00. Túto podmienky otestujeme hneď na začiatku, pretože ak je korytnačka diskvalifikovaná, nie je potrebné počítať čas, ktorý potrebovala na vyriešenie úloh. Nasledujúca časť kódu rieši problém diskvalifikácie:

ak2 zaroven (alebo :h1 >= 18 :h1 < 6 (zaroven :h1 = 6 :m1 = 0 :s1 = 0))
            (alebo :h2 >= 18 :h2 < 6 (zaroven :h2 = 6 :m2 = 0 :s2 = 0)) [
  ;pocitame cas riesenia
][
 
pis "diskvalifikovana
]

Riešenie úlohy o programátorskej súťaži môže vyzerať napr. takto:

viem vypocitajCas :h1 :m1 :s1 :h2 :m2 :s2

  ak2 zaroven (alebo :h1 >= 18 :h1 < 6 (zaroven :h1 = 6 :m1 = 0 :s1 = 0))
              (alebo :h2 >= 18 :h2 < 6 (zaroven :h2 = 6 :m2 = 0 :s2 = 0)) [
    urobTu "sek :s2 - :s1
    urobTu "min :m2 - :m1
    urobTu "hod :h2 - :h1

    ak :sek < 0 [
      urobTu "sek :sek + 60
      urobTu "min :min - 1
    ]

    ak :min < 0 [
      urobTu "min :min + 60
      urobTu "hod :hod - 1
    ]

    ak :hod < 0 [
      urobTu "hod :hod + 24
    ]

    pis :hod
    pis :min
    pis :sek
  ][
    pis "diskvalifikacia
  ]

koniec

Alternatívne bolo možné určiť rozdiel počiatočného a koncového času nasledovne: Previesť počiatočný aj koncový čas na sekundy, urobiť rozdiel a výsledný počet sekúnd spätne previesť na čas v hodinách, minútach a sekundách. Počet sekúnd sa tiež použije pri určovaní podmienky diskvalifikácie.

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

Celkovo riešilo úlohu 21 tímov. Niekoľko tímov riešilo úlohu prevodom na sekundy, čo nás príjemne prekvapilo. Niektoré tímy mali problémy so stanovením podmienky pre diskvalifikáciu korytnačky. Pre niektorých bol problematický aj prechod cez polnoc, prípadne neošetrenie situácie, keď po odčítaní sekúnd, prípadne minút vyšlo záporné číslo.