Autorské riešenie
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').
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.
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:
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:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |