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

  • Počet riešiteľov: 10 / 15 =  67 %

  • Úspešnosť riešenia:  4,2 / 6 = 70,0 %

Pri riešení úlohy najprv overíme, či zadané vstupné hodnoty a1, a2, a3, n1, n2 spĺňajú podmienky podľa zadania, t. j. a1 > a2 > a3, n1 > n2. Ak je splnená uvedená podmienka, potom môžu nastať 5 rôznych  situácií:

  • ak pre pomer dĺžok nových paličiek platí:  n1 / n2 = a1 / a2 = a2 / a3 , vtedy má úloha až dve riešenia:

    • nová palička bude v roli prvej (najdlhšej) paličky - krídla a jej dĺžkn n3 vypočítame podľa vzťahu: n3 = a1 · n1 / a2, resp.

    • nová palička bude v roli tretej (najkratšej) paličky - chvostu a jej dĺžku n3 vypočítame podľa vzťahu:  n3 = a3 · n2 / a2,  

  • ak pre pomer dĺžok nových paličiek platí:  n1 / n2 = a1 / a2 , tak tretia nová palička bude v roli tretej (najkratšej) paličky - chvostu a jej dĺžku n3 vypočítame podľa vzťahu:  n3 = a3 · n2 / a2

  • ak pre pomer dĺžok nových paličiek platí:  n1 / n2 = a1 / a3 , tak tretia nová palička bude v roli druhej (prostrednej) paličky - trupu a jej dĺžku n3 vypočítame podľa vzťahu:  n3 = a2 · n1 / a1

  • ak pre pomer dĺžok nových paličiek platí:  n1 / n2 = a2 / a3 , tak tretia nová palička bude v roli prvej (najdlhšej) paličky - krídla a jej dĺžku n3 vypočítame podľa vzťahu:  n3 = a1 · n1 / a2

  • v ostatných prípadoch pomer dĺžok nových paličiek n1 / n2 sa nerovná žiadnemu pomeru dĺžok a1, a2, a3, čo znamená, že úloha nemá riešenie.

Procedúra vypocet s 5 parametrami (dĺžkami krídla, trupu a chvostu pôvodného lietadla, dlžkami dlhšej a kratšej paličky nového lietadla), môže v jazyku Imagine Logo vyzerať napríklad takto:

;Imagine Logo

viem vypocet :a1 :a2 :a3 :n1 :n2
; a1 - dlžka krídla (najdlhšej paličky)
; a2 - dlžka trupu (prostrednej paličky)
; a3 - dlžka chvostu (najkratšej paličky)
; n1 - dlžka dlhšej novej paličky
; n2 - dlžka kratšej novej paličky

ak2 zároveň :n1 / :n2 = :a2 / :a3 :n1 / :n2 = :a1 / :a2 [
  výsledok (zoznam "|krídlo (1. palička)| :n1 * :a1 / :a2             "|chvost (3. palička)| :n2 * :a3 / :a2)
][
  ak2 :n1 / :n2 = :a2 / :a3 [
    výsledok zoznam "|krídlo (1. palička)| :n1 * :a1 / :a2
  ][
    ak2 :n1 / :n2 = :a1 / :a2 [
      výsledok zoznam "|chvost (3. palička)| :n2 * :a3 / :a2
    ][
      ak2 :n1 / :n2 = :a1 / :a3 [
        výsledok zoznam "|trup (2. palička)| :n1 * :a2 / :a1
      ][
        výsledok "|úloha nemá riešenie|
      ]
    ]
  ]
]
koniec

viem start
  píš vypocet 80 40 20 60 30
  píš vypocet 80 60 40 36 24
  píš vypocet 80 60 40 48 36
  píš vypocet 80 60 40 48 24
  píš vypocet 80 60 40 72 40

; krídlo (1. palička) 120 chvost (3. palička) 15
; krídlo (1. palička) 48
; chvost (3. palička) 24
; trup (2. palička) 36
; úloha nemá riešenie
koniec

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

#Python

def vypocet(a1, a2, a3, n1, n2):
    '''
    Pre zadane dĺžky a1, a2, a3, n1, n3 vypočíta dĺžku n3 tretej paličky 
    pre nové lietadlo
    :param a1: dĺžka krídla (najdlhšej paličky)
    :type  a1: float
    :param a2: dĺžka trupu (prostrednej paličky)
    :type  a2: float
    :param a3: dĺžka chvostu (najkratšej paličky)
    :type  a3: float
    :param n1: dĺžka dlhšej novej paličky
    :type  n1: float
    :param n2: dĺžka kratšej novej paličky
    :type  n2: float
    :rtype: list
    '''
    if n1 / n2 == a1 / a2 == a2 / a3 :
        return "krídlo (1. palička)", n1 * a1 / a2, "chvost (3. palička)", n2 * a3 / a2
    elif n1 / n2 == a2 / a3:
        return "krídlo (1. palička)", n1 * a1 / a2
    elif n1 / n2 == a1 / a2:
        return "chvost (3. palička)", n2 * a3 / a2
    elif n1 / n2 == a1 / a3:
        return "trup (2. palička)", n1 * a2 / a1
    else:
        return "úloha nemá riešenie"

print(vypocet(80, 40, 20, 60, 30))  # ('krídlo (1. palička)', 120.0,
                                    #  'chvost (3. palička)', 15.0)
print(vypocet(80, 60, 40, 36, 24))  # ('krídlo (1. palička)', 48.0)
print(vypocet(80, 60, 40, 48, 36))  # ('chvost (3. palička)', 24.0)
print(vypocet(80, 60, 40, 48, 24))  # ('trup (2. palička)', 36.0)
print(vypocet(80, 60, 40, 72, 40))  #  úloha nemá riešenie

Iné komplexnejšie riešenie úlohy v jazyku Python, v ktorom pomocou výnimiek ošetrujeme typy aj hodnoty vstupov, môže vyzerať napríklad takto:

#Python

def jeCislo(x):
    return type(x) in (int, float)

def vypocet(a1, a2, a3, n1, n2):
    '''
    Pre zadane dĺžky a1, a2, a3, n1, n3 vypočíta dĺžku n3 tretej paličky 
    pre nové lietadlo
    :param a1: dĺžka krídla (najdlhšej paličky)
    :type  a1: float
    :param a2: dĺžka trupu (prostrednej paličky)
    :type  a2: float
    :param a3: dĺžka chvostu (najkratšej paličky)
    :type  a3: float
    :param n1: dĺžka dlhšej novej paličky
    :type  n1: float
    :param n2: dĺžka kratšej novej paličky
    :type  n2: float
    :rtype: set of tuple
    '''
    if not (jeCislo(a1) and 
            jeCislo(a2) and 
            jeCislo(a3) and 
            jeCislo(n1) and 
            jeCislo(n2)):
        raise TypeError("nie všetky zadané hodnoty sú čísla")
    if not ((a1 > a2 > a3) and (n1 > n2)):
        raise ValueError("zadané vstupné hodnoty nie sú usporiadané alebo sú si rovné")
    vysledok = set()
    if n1 / n2 == a1 / a3:
        vysledok.add(("trup (2. palička)", n1 * a2 / a1))
        return vysledok
    if n1 / n2 == a2 / a3:
        vysledok.add(("krídlo (1. palička)", n1 * a1 / a2))
    if n1 / n2 == a1 / a2:
        vysledok.add(("chvost (3. palička)", n2 * a3 / a2))
    return vysledok

try:
    print(vypocet(80, 60, 40, 48, 24))   # {('trup (2. palička)', 36.0)}
    #print(vypocet(80, 60, 40, 36, 24))   # {('krídlo (1. palička)', 48.0)}
    #print(vypocet(80, 60, 40, 48, 36))   # {('chvost (3. palička)', 24.0)}
    #print(vypocet(80, 40, 20, 60, 30))   # {('krídlo (1. palička)', 120.0|, 
                                          #  ('chvost (3. palička)', 15.0)}
    #print(vypocet(80, 60, 40, 72, 40))   # set() ... úloha nemá riešenie
    #print(vypocet(80, 60, 40, 72, 80))   # zadané vstupné hodnoty nie sú usporiadané 
                                          # alebo sú si rovné
    #print(vypocet(80, 60, 40, 72, "a"))  # nie všetky zadané hodnoty sú čísla
except ValueError as chyba:
    print (chyba)
except TypeError as chyba:
    print (chyba)

Táto súťažná úloha je zameraná na použitie logického myslenia a dôslednosť uvažovania (ošetrenie vstupov a výstupov), na precvičenie použitia procedúr s parametrami a s výstupom, resp. funkcií s parametrami, na precvičenie práce s príkazmi priradenia, vetvenia a zloženými podmienkami.

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

Do riešenia tejto úlohy sa zapojilo 10 tímov kategórie EXPERT a 0 tímov kategórie GURU. Len 1 tím (Oravska Lesna 1) získal plný počet bodov, k čomu im gratulujeme. Jeden tím (Bubak) vyriešil úlohu pre neusporiadané vstupy. Len jeden tím overoval usporiadanosť vstupov, za čo sme neudeľovali body. Súťažiaci dosiahli priemerný počet bodov 4,2 z možných 6 bodov. 2 tímy (Dakto, aa) riešili úlohu v jazyku Python a 8 tímov v jazyku Imagine Logo.

V riešeniach sme zaregistrovali nasledovné chyby:

  • neošetrenie pripadu, keď plati n1/n2=a1/a2=a2/a3, kde vysledkom su dve riesenia,
  • neošetrenie prípadu, keď úloha nemá riešenie,
  • zjednodušenie riešenia úlohy, keď namiesto 5 vstupov boli použité len 2 vstupy (n1, n2) a ostatné vstupy (a1, a2,a3) boli určené fixne,
  • použitie globálnych premenných (príkaz urob) namiesto lokálnych (príkaz urobTu).

Pri riešení odporúčame použiť testovacie údaje pre overenie správnosti svojho riešenia. Rovnako odporúčame namiesto procedúr s výpisom používať funkcie vracajúce výslednú hodnotu, ktorú môžme nielen vypísať, ale aj inak spracovať.