Autorské riešenie
[stiahni py1 py2 py3]                                       

  • Počet riešiteľov: 4 / 7 = 57,14 %

  • Úspešnosť riešenia:  2,75 / 5 =  55,00 %

Pri tvorbe riešenia úlohy musíme zohľadniť kritériá zo zadania úlohy:

  • Na začiatku sprievodu kráčajú 2 najstaršie korytnačky v poradí od najstaršej. Ak je takýchto korytnačiek viac, vyberú sa ľubovoľné z nich.
  • Po nich nasledujú 4 najmladšie korytnačky v poradí od najmladšej. Ak je takýchto korytnačiek viac, vyberú sa ľubovoľné z nich.
  • Na konci sú zaradené všetky ešte nezaradené korytnačky.

Ak sa na sprievod neprihlási dostatočný počet korytnačiek, program vráti prázdny reťazec. Pre sprievod potrebujeme aspoň 6 korytnačiek, keďže zo zoznamu treba vybrať 2 najstaršie a 4 najmladšie. Poznáme prezývky korytnačiek, ktorých dĺžka značí aj vek korytnačky. Zo zadania vieme, že vek korytnačky zodpovedá dĺžke prezývky korytnačky. Vybrať 2 najstaršie korytnačky znamená nájsť 2 korytnačky s najdlhšími prezývkami. Podobne vybrať 4 najmladšie korytnačky znamená nájsť 4 korytnačky s najkratšími prezývkami.

Pre výber týchto korytnačiek zo zoznamu máme viacero riešení. Prvým je prechod zoznamom za pomoci cyklu s pevným počtom opakovaní, pričom v každom kroku cyklu overujeme, či aktuálna korytnačka nie je staršia resp. mladšia ako doteraz vybraná najstaršia/najmladšia korytnačka. Po ukončení cyklu vieme, že máme nájdenú najstaršiu/najmladšiu korytnačku. Po uložení korytnačky do výsledného zoznamu, túto korytnačku vymažeme zo zoznamu prihlásených korytnačiek. Pre najstaršie korytnačky zopakujem prechod zoznamom dvakrát pre najmladšie štyrikrát. Napokon po 6 vybraných korytnačkách na začiatku sprievodu doplníme za nimi do zoznamu ostávajúce korytnačky.

Výsledný program v jazyku Python môže vyzerať nasledovne:

#Python
def najdi_najstarsia_korytnacka(zoznam):
    najstarsia_korytnacka = zoznam[0]
    for korytnacka in zoznam:
        if len(najstarsia_korytnacka) < len(korytnacka):
            najstarsia_korytnacka = korytnacka
    return  najstarsia_korytnacka

def najdi_najmladsia_korytnacka(zoznam):
    najmladsia_korytnacka = zoznam[0]
    for korytnacka in zoznam:
        if len(najmladsia_korytnacka) < len(korytnacka):
            najmladsia_korytnacka = korytnacka
    return  najmladsia_korytnacka

def rozdelenie(zoznam):
    if len(zoznam) < 6:
        return []'

    zoznam = zoznam.copy()
    usporiadany_zoznam = []
    for i in range(2):
        korytnacka = najdi_najstarsia_korytnacka(zoznam)
        usporiadany_zoznam.append(korytnacka)
        zoznam.remove(korytnacka)

    for i in range(4):
        korytnacka = najdi_najmladsia_korytnacka(zoznam)
        usporiadany_zoznam.append(korytnacka)
        zoznam.remove(korytnacka)

    usporiadany_zoznam.extend(zoznam)
    
    return usporiadany_zoznam

Ďalším riešením ako môžeme v zozname nájsť najstaršie a najmladšie korytnačky je použitie príkazu sorted, ktorý vráti usporiadaný zoznam. Štandardne tento príkaz usporiadáva prvky zoznamu podľa abecedy, čo nám v tomto prípade ale nevyhovuje, lebo potrebujeme prvky zoznamu usporiadať podľa ich dĺžky. Na to slúži parameter key, ktorému povieme, že zoznam chceme usporiadať podľa dĺžky prvkov zoznamu. V usporiadanom zozname máme na začiatku najmladšie korytnačky a na konci najstaršie korytnačky. Zo zoznamu pomocou výrezov vyberieme 2 najstaršie (s krokom -1) a následne 4 najmladšie korytnačky.

Alternatívne riešenie v jazyku Python môže vyzerať nasledovne:

#Python
def rozdelenie(zoznam):
    if len(zoznam) < 6:
        return []

    zoznam = zoznam.copy()
    usporiadany_zoznam = sorted(zoznam, key=len)
    vysledok = usporiadany_zoznam[-1:-3:-1] + \
               usporiadany_zoznam[:4] + \
               usporiadany_zoznam[4:-2]
    return vysledok

Posledným spôsobom je úprava prvého riešenia za použitia funkcií max a min, ktoré vrátia maximálny a minimálny prvok zoznamu. Štandardne tieto funkcie vyberajú prvky zoznamu podľa abecedného poradia. Preto opäť použijeme parameter key, pomocou ktorého určíme spôsob výberu maximálneho a minimálneho prvku podľa dĺžky prvkov zoznamu.

Vylepšené prvé riešenie úlohy v jazyku Python môže vyzerať nasledovne:

#Python
def rozdelenie(zoznam):
    if len(zoznam) < 6:
        return []

    usporiadany_zoznam = []
    for i in range(2):
        najstarsia_korytnacka = max(zoznam, key=len)
        usporiadany_zoznam.append(najstarsia_korytnacka)
        zoznam.remove(najstarsia_korytnacka)

    for i in range(4):
        najmladsia_korytnacka = min(zoznam, key=len)
        usporiadany_zoznam.append(najmladsia_korytnacka)
        zoznam.remove(najmladsia_korytnacka)

    usporiadany_zoznam.extend(zoznam)

    return usporiadany_zoznam

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

Plný počet bodov za riešenie tejto úlohy získal len jeden tím oliverseman, ktorému gratulujeme. Medzi najčastejšie chyby v súťažných riešeniach patrilo:

  • neoverenie dostatočného počtu korytnačiek pre vytvorenie sprievodu,
  • použitie funkcie min a max bez špecifikácie porovnávania dĺžky slova v zozname,
  • nesprávne definovanie podmienok pre výber najstarších a najmladších korytnačiek,
  • nesprávny výber prvku poľa.