Autorské riešenie
[stiahni py]

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

  • Úspešnosť riešenia: 2 / 5 = 40,0 %

Pri riešení tejto úlohy nám pomôže obrázok s doplnenými konkrétnymi hodnotami dĺžok úsekov lomenej čiary uložených v zozname [30, 20, 40, 30, 50, 40, 30, 50].

lomená čiara s očíslovnými hanami

Vidíme, že na nepárnych pozíciach zoznamu sú uvedené dĺžky vodorovných úsečiek striedavo v smeroch východ a západ. A na párnych pozíciách zoznamu sú uvedené dĺžky zvislých úsečiek striedavo v smeroch sever a juh. Výslednú x-ovú zložku koncovej pozície vypočítame ako rozdiel súčtu dĺžok úsečiek v smere východ a súčtu dĺžok v smere západ. Podobne vypočítame výslednú y-ovú koncovú pozíciu ako rozdiel súčtu dĺžok úsečiek v smere sever a súčtu dĺžok úsečiek v smere juh. Podľa výsledných hodnôt x, y doplníme zoznam o štvoricu hodnôt tak, aby neobsahoval zápornú hodnotu. Ak je výsledná pozícia dronu zároveň jeho počiatočnou pozíciou nedopĺňame do zoznamu  štvoricu s nulovými hodnotami.

Funkcia dopln_trasu na doplnenie trasy dronu zadanej zoznamom dĺžok úsečiek, aby sa čo najskôr dostal do svojej počiatočnej pozície, môže vyzerať napr. nasledovne:

def dopln_trasu(prikazy):
    x = sum(prikazy[0::4]) - sum(prikazy[2::4])
    y = sum(prikazy[1::4]) - sum(prikazy[3::4])
    if x > 0:
        x_vychod, x_zapad = 0, x
    else:
        x_vychod, x_zapad = -x, 0
    if y > 0:
        y_sever, y_juh = 0, y
    else:
        y_sever, y_juh = -y, 0
    if not (x == y == 0):
        prikazy.extend([x_vychod, y_sever, x_zapad, y_juh])
    return prikazy


print(dopln_trasu([30, 20, 40, 30, 50, 40, 30, 50]))

Táto úloha je zameraná na:

  • použitie stratégií riešenia problémov - nakreslenie obrázka, hľadanie vzoru, dekompozíciu problému,

  • precvičenie príkazu volania funkcie s parametrami a návratovou hodnotou, príkazu vetvenia, príkazov na prácu so zoznamami (výrezy, pripojenie zoznamu na koniec iného zoznamu).

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

Do riešenia úlohy sa zapojilo 10 tímov z kategórie EXPERT. Plný počet bodov bodov nezískal žiaden tím. Najbližšie k tomu mali tímy karborura a mackybetter, ktorí podobne ako ostatní riešitelia neošetrili zbytočné pripojenie zoznamu 4 núl na koniec zoznamu v prípade ak koncová pozícia sa rovná počiatočnej pozícii.

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:

  • použitie kreslenia na zistenie koncovej pozície vyzerá ako vtipne obídenie výpočtu, len sa pri tom využíva navyše ďalší modul (turtle) a vo všeobecnosti pri kreslení môže pri zmene polohy pera dôjsť k nepresnosti výpočtu.

  • nesprávne použitie zaokrúhľovania (funkcie ROUND) pri výpočte pozície,

  • zbytočné použitie ďalšieho zoznamu s opakújúcimi sa smermi pohybu,

  • použitie funkcie bez parametrov,

  • použitie nemnemonických jednopísmenových identifikátorov premenných (napr. a, b, c, d, e, f, g, h),

  • odovzdanie nedokončeného a nefunkčného programu bez použitia funkcie.