Autorské riešenie
[stiahni py, py]

  • Počet riešiteľov: 5 / 6 =  83 %

  • Úspešnosť riešenia: 4,3 / 5 = 86.00 %

Podľa zadania úlohy máme vykresliť klaviatúru s bielymi a čiernymi klávesmi v poradí farieb zadaných textovým reťazcom (napr. 'bcbcbbcbcbcbbc', resp. 'cbbcbcbbcbcbcbbcbcbb').

klaviatúra s klávesmi 'bcbcbbcbcbcbbc'         klaviatúra s klávesmi 'cbbcbcbbcbcbcbbcbcbb'

Analyzovaním ilustračných obrázkov môžeme prísť na to, že keby sme vykresľovali len biele klávesy, tak by sme mohli začať vykresľovanie v ľavom hornom rohu klávesu a po jeho vykreslení by sme posunuli do jeho pravého horného rohu, resp. do ľavého horného bodu nasledovného klávesu. Pri vykresľovaní čierneho klávesu sa na začiatku posunieme vľavo o polovicu jeho šírky a po jeho vykreslení sa vrátime na pôvodné miesto vľavo o polovicu jeho šírky. Na nasledovnom obrázku môžeme zachytiť túto situáciu, keď začíname vľavo na zelenej pozícii a postupne sa posúvame na červené pozície, a to prípade kreslenia bielych aj čiernych klávesov.

klaviatúra s klávesmi 'bcbcbbcbcbcbbc'

Pri tomto riešení kreslíme čierne klávesy s obrysom a výplňou a biele klávesy s obrysom ale bez výplne.

Výsledný program môže vyzerať napr. nasledovne:

import turtle


def kresli_klaves(sirka, vyska):
    for _ in range(2):
        pero.forward(sirka)
        pero.right(90)
        pero.forward(vyska)
        pero.right(90)


def kresli_klaviaturu(klavesy):
    sirka_biele = 24
    vyska_biele = 100
    sirka_cierne = 16
    vyska_cierne = 60
    for idx in range(len(klavesy)):
        if klavesy[idx] == 'b': # kreslime bez vyplne a posunieme sa
            kresli_klaves(sirka_biele, vyska_biele)
            pero.forward(sirka_biele)
        else: # kreslime s vyplnou a neposunieme sa
            pero.forward(-sirka_cierne / 2)
            pero.begin_fill()
            kresli_klaves(sirka_cierne, vyska_cierne)
            pero.end_fill()
            pero.forward(sirka_cierne / 2)


platno = turtle.Screen()
platno.delay(0)

pero = turtle.Turtle()
pero.hideturtle()
pero.speed(0)
pero.color('black', 'black')

kresli_klaviaturu('bcbcbbcbcbcbbc')
# kresli_klaviaturu('cbbcbcbbcbcbcbbcbcbb')

platno.mainloop()

Ak by sme chceli vykresľovať biele (alebo svetlé) klávesy s výplňou, tak by bol vhodnejší iný prístup - najprv nakresliť biele klávesy, vrátiť sa na začiatok vykresľovania a následne vykresliť čierne klávesy. Pri vykresľovaní čiernych klávesov uprávíme textový reťazec, tak že nahradíme podreťazec 'bb' znakom 'x' a znak 'b' prázdným znakom. Takto dostaneme nový reťazec, ktorý obsahuje len znaky 'c' a 'x'. Pri prechádzaní týmto reťazcom vykresľujeme čierny kláves len pri prečítaní znaku 'c', pričom sa posúvame vpravo nezávisle či bol prečítaný znak 'c' alebo  'x'.

Výsledný program môže vyzerať napríklad nasledovne:

import turtle

def kresli_klaves(sirka, vyska, farba):
    pero.pendown()
    pero.fillcolor(farba)
    pero.begin_fill()
    for _ in range(2):
        pero.forward(sirka)
        pero.right(90)
        pero.forward(vyska)
        pero.right(90)
    pero.end_fill()
    pero.penup()


def kresli_klaviaturu(klavesy: str):
    sirka_biele = 24
    vyska_biele = 100
    sirka_cierne = 16
    vyska_cierne = 60
    pocet_bielych = klavesy.count('b')
    for pocitadlo in range(pocet_bielych):
        kresli_klaves(sirka_biele, vyska_biele, 'white')
        pero.forward(sirka_biele)
    pero.forward(-pocet_bielych * sirka_biele)
    if klavesy[0] == 'c':
        pero.forward(-sirka_cierne / 2)
    else:
        pero.forward(sirka_cierne)
    klavesy = klavesy.replace('bb', 'x')
    klavesy = klavesy.replace('b', '')
    for farba in klavesy:
        if farba == 'c':
            kresli_klaves(sirka_cierne, vyska_cierne, 'black')
        pero.forward(sirka_biele)


platno = turtle.Screen()
platno.delay(0)

pero = turtle.Turtle()
pero.hideturtle()
pero.speed(0)

kresli_klaviaturu('bcbcbbcbcbcbbc')
# kresli_klaviaturu('cbbcbcbbcbcbcbbcbcbb')
platno.mainloop()

Táto úloha je zameraná na:

  • použitie stratégie riešenia problémov - dekompozícia problému na podproblémy a hľadanie vzorov,

  • precvičenie príkazov volania funkcií s parametrami, cyklu for, prácu s reťazcami, príkazov korytnačej grafiky.

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

Do riešenia úlohy sa zapojilo len 5 tímov z kategórie EXPERT a nesúťažne 1 tím z kategórie GURU. Plný počet bodov za svoje riešenie získali tímy chaos, raketak a takacpisko, ktorým srdečne gratulujeme.

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

  • vykreslenie len konkrétneho ilustratívneho obrázku uvedeného v zadaní,

  • nedôsledný rozbor úlohy, ktorého dôsledkom bolo vykresľovanie prvého čierneho klávesu vodorovne a nie zvislo ako ostatné klávesy,

  • nepoužitie funkcie s parametrami, anpriek tomu, že sa to vyžadovalo v zadaní,

  • vykresľovanie klaviatúry otočenej o 90 stupňov.