Autorské riešenie
[stiahni jazdne_pruhy.py]                                       

  • Počet riešiteľov: 47 / 51 = 92 %

  • Úspešnosť riešenia: 4,15 / 5 = 83 %                 

Máme vytvoriť program, ktorý bude kresliť dopravnú značku informujúcu o počte jazdných pruhov na danej ceste. Pre každú značku uvedieme dĺžku symbolu pre jazdný pruh, počet pruhov v protismere a počet pruhov v smere jazdy. Vzájomné vzdialenosti medzi symbolmi jazdných pruhov a okrajmi značky sú rovnaké. Táto vzdialenosť je rovná 1/5 dĺžky symbolu pre jazdný pruh. Príklady sú uvedené na nasledujúcich obrázkoch.

ukážka dopravných značiek

Je známe, že pruhy v smere jazdy (nahor), ak také sú, sa u nás značia napravo od pruhov v protismere jazdy (nadol), ak také sú. Pruhom je úsečka dĺžky určenej parametrom zakončená bodkou.

Je výhodné vytvoriť si zvlášť funkcie vykonávajúce menšie operácie. Funkcie vykresľujúce pruh v smere (sipka_hore) a v protismere (sipka_dole) môžu vyzerať napríklad takto:

def sipka_hore(dlzka):
    pero.forward(dlzka)
    pero.dot(dlzka / 10)
    pero.backward(dlzka)

def sipka_dole(dlzka):
    pero.forward(dlzka)
    pero.backward(dlzka)
    pero.dot(dlzka / 10)

Obe funkcie sú konzistentné, teda vrátia korytnačku na počiatočné miesto vykresľovania. Vďaka tomu nám postačuje jedna funkcia, ktorá zabezpečí posun medzi danými pruhmi. Musíme tiež myslieť na konzistentnosť a po posune ponechať korytnačku otočenú v smere vykresľovania. Zo zadania vieme, že sa musíme posunúť o pätinu dĺžky symbolu:

def posun(dlzka):
    pero.penup()
    pero.right(90)
    pero.forward(dlzka / 5)
    pero.left(90)
    pero.pendown()

Po vyriešení týchto podproblémov vytvoríme funkciu, ktorá vykreslí značku s danými parametrami. Vďaka spomínanej konzistencii pri vykresľovaní nepotrebujeme používať podmienku pri rozhodovaní, či budeme vykresľovať šípku nahor alebo nadol. Jednoducho vykreslíme všetky, najprv v protismere, neskôr v smere jazdy pomocou for cyklu. Pre každý pruh vykreslíme šípku a posunieme sa na ďalšiu pozíciu vykresľovania.

Po vykreslení posledného pruhu sme sa posunuli na pozíciu, ktorá je súčasťou orámovania značky. Orámovanie značky je obdĺžnik. Jeho rozmery môžeme ľahko určiť pomocou informácií zo zadania. Výška je 1,4-násobok dĺžky symbolu. Šírka je súčin pätiny dĺžky symbolu a počtu všetkých vzniknutých medzier, t.j. počet všetkých pruhov + 1.

def kresli_znacku(dlzka, spat, tam):
    for sipka in range(spat):
        sipka_dole(dlzka)
        posun(dlzka)
    for sipka in range(tam):
        sipka_hore(dlzka)
        posun(dlzka)

    pero.backward(dlzka / 5)
    for i in range(2):
        pero.forward(dlzka * 1.4)
        pero.left(90)
        pero.forward((spat + tam + 1) * dlzka / 5)
        pero.left(90)

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

Do riešenia tejto úlohy sa spolu zapojilo 46 súťažiacich, z toho bolo 11 z kategórie EXPERT a 35 z kategórie GURU. Plný počet bodov získalo 6 súťažiacichv kategórii EXPERT a 17  súťažiacich v kategórii GURU. Všetkým zúčastneným gratulujeme :)

Z odovzdaných riešení bola v 34 z nich použitá korytnačia grafika. Ďalších 10 bolo tvorených pomocou knižnice tkinter. V 1 riešení bola použitá knižnica matplotlib. V 1 riešení sa "vykresľovanie" vykonávalo do konzoly. Pri grafických úlohách odporúčame používanie knižníc turtle alebo tkinter, ktoré poskytujú dostatočné nástroje na to, aby sa Váš výstup podobal požadovanému výstupu.

Najčastejšou zbytočnou chybou bolo nerešpektovanie formálnej požiadavky na parametre funkcie (nie globálne premenné). V niekoľkých programoch sa tiež pracovalo s fixnými hodnotami, čo nabúravalo hromadnosť vzhľadom na niektoré alebo všetky parametre. Od tejto chyby sa často odvíjal problém správneho výpočtu dĺžky medzier medzi pruhmi. Ojedinele sa vyskytol problém, kedy chýbalo orámovanie značky, teda vykreslenie obdĺžnika. Pri riešeniach pomocou knižnice tkinter sa objavili problémy so správnym určením súradníc.

Medzi zaujímavé nevšedné riešenia patrí vykresľovanie pruhov sprava doľava, delenie pruhov na polovicu pri vykresľovaní, použitie vnorenenej funkcie, snaha o kontrolu vstupu, vycentrovanie obrázka a zaznačenie bodky ako úsečku dĺžky 1. Zopár kódov bolo krásne okomentovaných, čo veľmi chválime.