Autorské riešenie
[stiahni py]                                       

  • Počet riešiteľov: 27 / 29 = 93 %                       

  • Úspešnosť riešenia:  6.96 / 8 = 87 %                   

Úloha pozostávala z práce s 10 položkovým zoznamom čísel. Jej riešenie by sme mohli rozdeliť na tri časti: implementácia funkcie orezanie núl na začiatku a konci zoznamu, implementácia funkcie na zväčšenie / zmenšenie zoznamu a implementácia funkcie na zmenu intenzity hodnôt zoznamu.

1. Výrez (funkcia na odstránenie núl na začiatku a na konci zoznamu): riešenie môže byť založené na posúvaní indexu i od začiatku doprava, pokiaľ sú hodnoty nulové a následne posúvaním indexu j od konca doľava, kým sú hodnoty nulové. Na záver postačí vrátiť podzoznam od i po j (vrátane), ak existuje, inak prázdny zoznam

2. Zoom (funkcia na zväčšenie alebo zmenšenie zoznamu): ak je vstupný parameter faktora zväčšenia kladný, tak každú hodnotu vieme zopakovať faktor-krát. Kým je výsledný zoznam dlhší ako 10, orezávam symetricky z oboch strán napríklad príkazom novy = novy[1:-1]. Ak je vstupný parameter faktora zväčšenia záporný, tak vyberieme blok dĺžky abs(faktor), spočítame priemer bloku a zaokrúhlime ho na celé číslo. Ak je faktor=0, tak zoznam sa prirodzene nemení.

3. Intenzita (funkcia na zmenu intenzity hodnôt zoznamu): ak je vstupný parameter zmena kladný alebo nulový, tak pôvodnú hodnotu vynásobíme týmto parametrom, ale novú hodnotu ohraničíme na maximum 255. Ak je vstupný parameter zmena záporný, tak berieme jeho abdolútnu hodnotu ako deliteľa. Následne hodnotu zaokruhlíme.

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

 

import math

def vyrez(zoznam):
    i = 0
    while i < len(zoznam) and zoznam[i] == 0:
        i += 1
    j = len(zoznam) - 1
    while j >= 0 and zoznam[j] == 0:
        j -= 1
    return zoznam[i:j+1] if i <= j else []

def zoom(zoznam, faktor):
    if faktor > 0:
        novy = []
        for i in range(len(zoznam)):
            for _ in range(faktor):
                novy.append(zoznam[i])
        while len(novy) > 10:
            novy = novy[1:-1]
        return novy

    elif faktor < 0:
        faktor = abs(faktor)
        novy = []
        for i in range(0, len(zoznam), faktor):
            blok = zoznam[i:i+faktor]
            if blok:
                priemer = sum(blok) / len(blok)
                zaokruhlene = math.floor(priemer + 0.5)
                novy.append(zaokruhlene)
        return novy

    else:
        return zoznam


def intenzita(zoznam, zmena):
    vysledok = []
    if zmena >= 0:
        for hodnota in zoznam:
            nova = hodnota * zmena
            if nova > 255:
                nova = 255
            vysledok.append(nova)
    else:
        delitel = abs(zmena)
        for hodnota in zoznam:
            nova = round(hodnota / delitel)
            vysledok.append(nova)
    return vysledok
 

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

Úlohu riešilo 27 tímov. Väčšina tímov použila správny postup na dosiahnutie vhodného riešenia a využilo postup uvedený v autorskom riešení. Viaceré riešenia boli výborne okomentované. V niektorých riešeniach tímy pri augmentácii intenzita pri zápornom čísle používali násobenie namiesto delenia. Iné tímy pri kladnom zoome nevynechali symetricky hodnoty z oboch okrajov.