Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 7 / 23 = 30 %

  • Úspešnosť riešenia: 4.71 / 6 = 79 %

Skôr než začneme programovať, poďme sa poriadne pozrieť na to, ako sa kódujú čísla do obdĺžnikov. V zadaní je ukážka dvoch čísiel: 152 a -35. Z ukážok vieme, že:

  • počiatočné cifry sa zobrazujú v hornej časti a koncové cifry v spodnej časti obrázka,

  • ak cifry čísla zľava doprava stúpajú, môžeme ich zobraziť obdĺžnikmi, ktoré sa vzájomne prekrývajú,

  • ak je číslo kladné, obdĺžniky sa zobrazia vpravo od bodky, ak je číslo záporné, obdĺžniky sa zobrazia vľavo od bodky,

  • jednotlivé cifry čísla z obrázka čítame zhora smerom dole a

    •  od bodky doprava, ak je číslo kladné

    •  alebo od bodky doľava, ak je to číslo záporné.

Z ukážok nevieme, ako sa zobrazí cifra 0. Z textu "Šírka obdĺžnikov zodpovedala číslam, ktoré reprezentujú jednotlivé cifry čísla." môžeme dedukovať, že cifra 0 sa zobrazí ako obdĺžnik s "nulovou" šírkou. Čísla 150023 alebo -12300 by sa teda mohli zobraziť nasledovne:

Kódovanie čisel do obdĺžnikov

Každej cifra teda zodpovedná jedna hrubá čiarka v obrázku. Poslednou otázkou ostáva, ako sa zobrazí samotné číslo 0. Odpoveď ale už máme. Šírka obdĺžnika zodpovedá cifre. Teda bude "nulová".

Kódovanie čisel do obdĺžnikov - nula

Keď sme si ujasnili, ako sa čísla kódujú do obrázkov, poďme sa pozrieť ako takéto vykresľovanie obrázkov naprogramovať.

Podľa pokynov by bodka v čísle mala byť tam, kde bolo na začiatku umiestnené kresliace pero. Bolo by teda rozumné, vykresľovať obdĺžnikový kód čísla od bodky. Pri bodke sa nachádzajú obdĺžniky pre koncové cifry čísla. Cifry čísla teda budeme spracovávať odzadu.

Myšlienka vykresľovania obdĺžnikového kódu čísla môže byť nasledovná:

  1. pokiaľ sú v čísle ešte nejaké cifry, zober poslednú z nich,

  2. ak predchádzajúca spracovaná cifra bola menšia alebo rovná ako aktuálna cifra, posuň sa s perom vyššie,

  3. nakresli obdĺžnik pre danú cifru,

    • ak zadané číslo je kladné, kresli obdĺžnik doprava,

    • ak zadané číslo je záporné, kresli obdĺžnik doľava,

  4. pokračuj bodom 1.

# Python
import turtle

def kresli_obdlznik(vyska, sirka):
    pero.forward(vyska)
    pero.right(90)
    pero.forward(sirka)
    pero.right(90)
    pero.width(4)
    pero.forward(vyska)
    pero.right(90)
    pero.width(1)
    pero.forward(sirka)
    pero.right(90)

def kresli_cislo(cislo, zvacsenie):
    if cislo < 0:
        znamienko = -1
    else:
        znamienko = 1
    cislo = abs(cislo)
    predchadzajuca_cifra = 10
    pocet_posunov = 0

    if cislo == 0:
        kresli_obdlznik(zvacsenie, 0)
    else:
        while cislo > 0:
            aktualna_cifra = cislo % 10
            if aktualna_cifra >= predchadzajuca_cifra:
                pero.forward(zvacsenie)
                pocet_posunov += 1
            kresli_obdlznik(zvacsenie, znamienko * zvacsenie * aktualna_cifra)
            predchadzajuca_cifra = aktualna_cifra
            cislo = cislo // 10
        pero.backward(pocet_posunov * zvacsenie)
    pero.dot(10)


plocha = turtle.Screen()
pero = turtle.Turtle()
pero.left(90)

kresli_cislo(-12300, 20)

plocha.mainloop()

Všimnime si, ako sme vyriešili kreslenie obdĺžnikov vpravo alebo vľavo. Na kreslenie obdĺžnika sme definovali funkciu kresli_obdlznik() Ak bolo číslo kladné, voláme ju s dĺžkami strán. Ak bolo číslo záporné, pošleme jej zápornú šírku. Namiesto pohybu dopredu sa tak pero pohne vzad.

Vo funkcii kresli_cislo() sme definovali parameter navyše - zvacsenie. Jeho zmenou môžeme kresliť rôzne veľké obrázkové kódy čísel.

Vo funkcii kresli_cislo() sme špeciálne ošetrili prípad, ak zadané číslo je 0. Číslo 0 má jednu cifru a mal by sa teda vykresliť jeden obdĺžnik. Podmienka v cykle while by to neumožnila.

Dobrým zvykom pri kreslení je, aby grafické pero skončilo v rovnakej pozícii ako bolo na začiatku. Pri kreslení jedného obdĺžnika tomu tak je. Keďže obdĺžniky kreslíme v niekoľkých radoch, počítame si, koľko krát sme sa perom posunuli do vyššieho radu. Po vykreslení všetkých obdĺžnikov sa s perom vrátime do východiskovej pozície.

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

Vačšina z vás na túto úlohu išla správne. V riešeniach ste však mali drobné nedostatky. Zabudli ste kresliť bodku alebo zvýrazniť jednu stranu obdĺžnika. Niektorým z vás robila problém cifra 0, ktorú ste vykreslovali v samostanom obdĺžniku, pričom sa dala vykresliť v tom istom riadku ako obdĺžniky iných cifier.