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

  • Počet riešiteľov: 11 / 12 = 91,7 %

  • Úspešnosť riešenia:  1,8 / 6 = 30,3 %

Podľa zadania úlohy poznáme celkový počet zapísaných voličov (spolu) a priebežné spočítané hlasy troch kandidátov v zostupnom poradí (a, b, c; a > b > c). Pre priebežne spočítané hlasy a, b, c a zvyšok hlasov (zvyšok; zvyšok = spolu - (a + b + c)) môžu nastať rôzne situácie týkajúce sa konečného poradia kandidátov, ktoré sú zachytené nižšie v tabuľke. Veľmi užitočnou pomôckou pre určenie konečného poradia kandidátov pre uvedené sitácie sú diagramy s farebnými stĺpcami predstavujúcimi množstvo hlasov kandidátov - A (zelený stĺpec), B (červený stĺpec), C (modrý stĺpec) a zvyšné zatiaľ nezapočítané hlasy (žltý stĺpec nad červeným alebo modrým stĺpcom).

Podmienky b > c + zvyšok b = c + zvyšok b < c + zvyšok
a > b + zvyšok situácia 1
A: 1.
B: 2.
C: 3. miesto
situácia 2
A: 1.
B: 2.
C: 2., 3.
situácia 3
A: 1.
B: 2., 3.
C: 2., 3.
a = b + zvyšok situácia 4
A: 1.
B: 1., 2.
C: 3.
situácia 5
A: 1.
B: 1., 2.
C: 2., 3.
situácia 6
A: 1.
B: 1., 2., 3.
C: 2., 3.
a < b + zvyšok situácia 7
A: 1., 2.
B: 1., 2.
C: 3.
situácia 8
A: 1., 2.
B: 1., 2.
C: 2., 3.
a > c + zvyšok situácia 9
A: 1., 2.
B: 1., 2., 3.
C: 2., 3.
a = c + zvyšok situácia 10
A: 1., 2.
B: 1., 2., 3.
C: 1., 2., 3.
a < c + zvyšok situácia 11
A: 1., 2., 3.
B: 1., 2., 3.
C: 1., 2., 3.

Na základe tohto rozboru vytvoríme programy v Imagine Logu a Pythone, ktoré pre zadané 4 hodnoty hlasov zachytávajú 11 uvedených situácií s možným konečným poradím kandidátov volieb.

Procedúra vysledky so 4 parametrami (celkovým počtom zapísaných voličov, počtami priebežne získaných hlasov 3 kandidátmi na prezitenta), môže v jazyku Imagine Logo vyzerať napríklad takto:

viem vysledky :spolu :a :b :c
  ; vypočíta a vypíše možné konečné poradie jednotlivých kandidátov
  ; spolu: celkový počet voličov
  ; a: počet získaných hlasov kandidáta A
  ; b: počet získaných hlasov kandidáta B
  ; c: počet získaných hlasov kandidáta C
  urobTu "zvysok :spolu - (:a + :b + :c)
  ak2 :a > :b + :zvysok [
    ak2 :b > :c + :zvysok [
      urobTu "hlaska "|A bude na 1. mieste, B bude na 2. mieste, C bude na 3. mieste.|
    ][
      ak2 :b = :c + :zvysok [
        urobTu "hlaska "|A bude na 1, mieste, B bude na 2. mieste, C bude na 2. alebo 3. mieste.|
      ][
        urobTu "hlaska "|A bude na 1. mieste, B bude na 2. alebo 3. mieste, C bude na 2. alebo 3. mieste.|
      ]
    ]
  ][
    ak2 :a = :b + :zvysok [
      ak2 :b > :c + :zvysok [
        urobTu "hlaska "|A bude na 1. mieste, B bude na 1. alebo 2. mieste, C bude na 3. mieste.|
      ][
        ak2 :b = :c + :zvysok [
          urobTu "hlaska "|A bude na 1. mieste, B bude na 1. alebo 2. mieste, C bude na 2. alebo 3. mieste.|
        ][
          urobTu "hlaska "|A bude na 1. mieste, B bude na 1. alebo 2. alebo 3. mieste, C bude na 2. alebo 3. mieste.|
        ]
      ]
    ][
      ak2 :b > :c + :zvysok [
        urobTu "hlaska "|A bude na 1. alebo 2. mieste, B bude na 1. alebo 2. mieste, C bude na 3. mieste.|
      ][
        ak2 :b = :c + :zvysok [
          urobTu "hlaska "|A bude na 1. alebo 2. mieste, B bude na 1. alebo 2. mieste, C bude na 2. alebo 3. mieste.|
        ][
          ak2 :a > :c + :zvysok [
            urobTu "hlaska "|A bude na 1. alebo 2. mieste, B bude na 1. alebo 2. alebo 3. mieste, C bude na 2. alebo 3. mieste.|
          ][
            ak2 :a = :c + :zvysok [
              urobTu "hlaska "|A bude na 1. alebo 2. mieste, B bude na 1. alebo 2. alebo 3. mieste, C bude na 1. alebo 2. alebo 3. mieste.|
            ][
              urobTu "hlaska "|A bude na 1. alebo 2. alebo 3. mieste, B bude na 1. alebo 2. alebo 3. mieste, C bude na 1. alebo 2. alebo 3. mieste.|
            ]
          ]
        ]
      ]
    ]
  ]
  výsledok :hlaska
koniec

viem start
  píš vysledky 250 100 80 60
  píš vysledky 260 100 80 70
  píš vysledky 265 100 80 70

  píš vysledky 270 100 90 70
  píš vysledky 260 100 80 60
  píš vysledky 270 100 80 70

  píš vysledky 270 100 90 60
  píš vysledky 280 100 90 70

  píš vysledky 285 100 90 70
  píš vysledky 290 100 90 70
  píš vysledky 300 100 90 70
koniec

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

def vysledky(spolu, a, b, c):
    '''
    vypočíta a vypíše možné konečné poradie jednotlivých kandidátov
    :param spolu: celkový počet voličov
    :type  spolu: int
    :param a: počet získaných hlasov kandidáta A
    :type  a: int
    :param b: počet získaných hlasov kandidáta B
    :type  b: int
    :param c: počet získaných hlasov kandidáta C
    :type  c: int
    :rtype hlaska: str
    '''
    zvysok = spolu - (a + b + c)
    if a > b + zvysok:
        if b > c + zvysok:
            hlaska = "A bude na 1. mieste, B bude na 2. mieste, C bude na 3. mieste."
        else:
            if b == c + zvysok:
                hlaska = "A bude na 1, mieste, B bude na 2. mieste, \
C bude na 2. alebo 3. mieste."
            else:
                hlaska = "A bude na 1. mieste, B bude na 2. alebo 3. mieste, \
C bude na 2. alebo 3. mieste."
    else:
        if a == b + zvysok:
            if b > c + zvysok:
                hlaska = "A bude na 1. mieste, B bude na 1. alebo 2. mieste, \
C bude na 3. mieste."
            else:
                if b == c + zvysok:
                    hlaska = "A bude na 1. mieste, B bude na 1. alebo 2. mieste, \
C bude na 2. alebo 3. mieste."
                else:
                    hlaska = "A bude na 1. mieste, B bude na 1. alebo 2. alebo \
3. mieste, C bude na 2. alebo 3. mieste."
        else:
            if b > c + zvysok:
                hlaska = "A bude na 1. alebo 2. mieste, B bude na 1. alebo 2. mieste,\
 C bude na 3. mieste."
            else:
                if b == c + zvysok:
                    hlaska = "A bude na 1. alebo 2. mieste, B bude na 1. alebo \
2. mieste, C bude na 2. alebo 3. mieste."
                else:
                    if a > c + zvysok:
                        hlaska = "A bude na 1. alebo 2. mieste, B bude na 1. alebo \
2. alebo 3. mieste, C bude na 2. alebo 3. mieste."
                    else:
                        if a == c + zvysok:
                            hlaska = "A bude na 1. alebo 2. mieste, B bude na 1. \
alebo 2. alebo 3. mieste, C bude na 1. alebo 2. alebo 3. mieste."
                        else:
                            hlaska = "A bude na 1. alebo 2. alebo 3. mieste, \
B bude na 1. alebo 2. alebo 3. mieste, C bude na 1. alebo 2. alebo 3. mieste."
    return hlaska

print(vysledky(250, 100, 80, 60))
print(vysledky(260, 100, 80, 70))
print(vysledky(265, 100, 80, 70))

print(vysledky(270, 100, 90, 70))
print(vysledky(260, 100, 80, 60))
print(vysledky(270, 100, 80, 70))

print(vysledky(270, 100, 90, 60))
print(vysledky(280, 100, 90, 70))

print(vysledky(285, 100, 90, 70))
print(vysledky(290, 100, 90, 70))
print(vysledky(300, 100, 90, 70))

Táto súťažná úloha je zameraná na použitie logického myslenia a dôslednosť uvažovania (rozlíšenie rôznych situácií), na precvičenie použitia procedúry s parametrami a s výstupom, resp. funkcie s parametrami, na precvičenie práce s príkazmi viacnásobne vnoreného vetvenia a príkazu priradenia.

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

Do riešenia tejto úlohy sa zapojilo 11 tímov kategórie EXPERT. Žiaden tím nezískal plný počet bodov. Najdôslednejšie riešenie odovzdal tím Bojovník Macek. Uvedená úloha bola pre súťažiacich vešmi náročná, lebo v nej dosiahli priemerný počet bodov 1,8 z možných 6 bodov. V jazyku Python riešilo úlohu 6 tímov a v jazyku Imagine Logo 5 tímov.

V riešeniach sme zaregistrovali nasledovné chyby:

  • nedôslednosť pri zvažovaní rôznych situácií, ktoré môžu nastať - často sa zabúdalo na podmienku, keď sa konečné počty hlasov kandidátov mohli rovnať,
  • nesprávne zjednodušenie riešenia úlohy:
    • vypočítanie len maximálnej hodnoty pre zadané počty hlasov jednotlivých kandidátov, resp. ich usporadúvanie,
    • nepoužitie zvyšných nezapočítaných hlasov do výpočtu,
    • nepoužitie podmienok s rozdielmi medzi hlasov jednotlivých kandidátov,
  • zbytočne veľa vnorených podmienok,
  • zbytočné použitie percent,
  • v Imagine Logo riešeniach neprehľadný neodsadený kód programu.

Odporúčame súťažiacim, aby nabudúce pri riešení úloh si vykreslili možné prípady a zotriedili ich v tabuľke ako je to uvedené v autorskom riešení. 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ť.