Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 32 / 43 = 74 %

  • Úspešnosť riešenia:  5.15 / 6 = 86 %

Rozdelenie hodnôt do troch, štyroch, či piatich intervalov rovnakej šírky s výpisom hraníc týchto intervalov je možné riešiť viacerými spôsobmi. Celý postup riešenia by sme mohli rozdeliť do týchto piatich krokov:

  1. Nájdeme vedecký zápis čísla pre najväčšiu nameranú hodnotu. Na vedecký zápis čísla sa používa mocnina čísla 10 (túto mocninu nazývame exponent). Napríklad číslo 6789 vieme pri vedeckom zápise zapísať ako 6,789.10^3 s exponentom 3. Najvýznamnejšou cifrou čísla 1234 je tak cifra na mieste 10^3, teda na mieste tisícok, a to je cifra 1.

    Prvý spôsob, akým je možné nájsť exponent, využíva dĺžku reťazca, ktorý reprezentuje ľubovoľné kladné a celé číslo:
    # Python
    def zisti_exponent(cislo):
        exponent = len(str(round(cislo)))-1
        return exponent
                    
    Iný spôsob nájdenia exponenta využíva pojem logaritmu (učivo strednej školy):
    # Python
    def zisti_exponent(cislo):
        if cislo == 0:
            return 0
        exponent = math.floor(math.log(abs(cislo),10))
        return exponent
                    
    Tretí spôsob nájdenia exponenta využíva f-string, ktorý poskytuje jazyk Python:
    # Python
    def zisti_exponent(cislo):
        cislo = f'{cislo:e}'))
        poz_e = cislo.index('e')  
        exponent = int(cislo[poz_e+1:])
        return exponent
                    
  2. Zaokrúhlime najväčšiu nameranú hodnotu nahor vzhľadom na najvýznamenšiu cifru (vzhľadom na nájdený exponent v prvom kroku). Exponent nula znamená zaokrúhľovanie na jednotky, exponent 1 znamená zaokrúhľovanie na desiatky, exponent 2 znamená zaokrúhľovanie na stovky, exponent 3 zaokrúhľovanie na tisícky a podobne).
  3. Zaokrúhlime najmenšiu nameranú hodnotu nadol vzhľadom na najvýznamenšiu cifru (vzhľadom na nájdený exponent v prvom kroku). Exponent nula znamená zaokrúhľovanie na jednotky, exponent 1 znamená zaokrúhľovanie na desiatky, exponent 2 znamená zaokrúhľovanie na stovky, exponent 3 zaokrúhľovanie na tisícky a podobne).
  4. Pomocou rozdielu medzi najmenšou a najväčšou zaokrúhlenou hodnotou určíme počet intervalov podľa pravidiel, ktoré sú uvedené v zadaní. Môžeme teda dostať hodnotu troch, štyroch alebo piatich intervalov.
  5. Podľa zisteného počtu intervalov v štvrtom kroku určíme šírku jedného intervalu (podiel medzi rozdielom a počtom intervalov) a vypíšeme postupne hranice týchto intervalov.

Nasleduje možný zdrojový kód v jazyku Python

# Python
			
import math

def zisti_exponent(cislo):
    # najde exponent mocniny cisla 10 vo vedeckom zapise cisla
    exponent = len(str(round(cislo))) - 1
    return exponent

def zaokruhli_najvyznamnejsiu_cifru_hore(cislo):
    exponent = zisti_exponent(cislo)
    return math.ceil(cislo / 10 ** exponent) * 10 ** exponent

def zaokruhli_na_rad_dole(cislo, exponent):
    # zaokruhli dole na exponent cisla 10 vo vedeckom zapise cisla
    # 0 - na jednotky, 1 - na desiatky, 2 - na stotiny a podobne
    return math.floor(cislo / 10 ** exponent) * 10 ** exponent


def generuj_skupiny(min, max):
    min = zaokruhli_na_rad_dole(min, zisti_exponent(max))
    max = zaokruhli_najvyznamnejsiu_cifru_hore(max)
    rozdiel = max - min
    # urcime pocet intervalov
    prva_cifra = str(rozdiel)[0]
    if prva_cifra in '369':
        pocet_intervalov = 3
    elif prva_cifra in '248':
        pocet_intervalov = 4
    else:
        pocet_intervalov = 5
    # vratime hranice intervalov, ktore si ulozime do pola
    sirka_intervalu = rozdiel / pocet_intervalov
    intervaly = []
    for i in range(pocet_intervalov):
        intervaly.append(min + sirka_intervalu * i)
    intervaly.append(max)
    return intervaly



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

Úlohu riešilo 32 tímov. Väčšina tímov použila na nájdenie exponentov prvý spôsob, cez dĺžku reťazca. Niektoré tímy využili aj logaritmus. Tretí spôsob, cez f-string, sa v riešeniach neobjavil. Vyskytli sa viaceré originálne riešenia s kratším, menej čitateľným, ale aj dlhším, detailne okomentovaným zdrojovým kódom. Väčšina tímov správne určila počet intervalov aj ich hranice. Najčastejšie chyby spočívali v nesprávnom zaokrúhľovaní (použitie iba jednoduchého matematického zaokrúhľovania alebo opakovane, ak bolo najväčšou hodnotou číslo 9000, za hornú hranicu intervalov ste vybrali hodnotu 10000), ale aj pri výpise hraníc, kde viaceré tímy intervaly začali vypisovať od 0 aj v prípade, že na vstupe boli hodnoty napríklad 1113 a 1234 (v takom prípade je dolná hranica 1000 a horná hranica 2000). Niektoré tímy s programovaním v Pythone iba začínajú, a teda sa im podarilo vyriešiť aspoň načítanie vstupov a niektoré základné matematické operácie.