Autorské riešenie
[stiahni imp py ]                                      

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

  • Úspešnosť riešenia: 3,75 / 6 = 62,5%                   

Riešenie tejto úlohy nie je náročné. Musíme si ho však vopred premyslieť.

Pre skladanie veží zo štvorčekov platia isté pravidlá:

  1. na stavebnicový štvorček môžeme položiť len od neho menší stavebnicový štvorček,

  2. stavebnicové štvorčeky vo veži musia byť vzájomne vycentrované na stred.

Pozrime sa najskôr na prvú podmienku.

Dôsledkom tejto podmienky je, že ak chceme postaviť najvyššiu vežu, tak začneme najväčším štvorčekom. Postupne do veže pridávame menšie a na úplný vrchol položíme najmenší štvorček. Bolo by teda celkom fajn, keby sme zoznam štvorčekov usporiadali od najväčšieho po najmenší. V Pythone využijeme funkciu zoznamu sort() a v Imagine operácie utrieď a prevráť.

Keďže na štvorček môžeme položiť len od neho menší, z každej veľkosti štvorčekov môžeme použiť najviac jednu. Potrebovali by sme teda zoznam štvorčekov bez duplicít. Ak už budeme mať zoznam usporiadaný, môžeme z neho vytvoriť nový, do ktorého vložíme každú veľkosť strany len raz.

Druhá podmienka vyžaduje, aby boli štvorčeky vzájomne vycentrované. Dosiahnuť to môžeme viacerými spôsobmi. Napr. tak, že štvorčeky budeme kresliť zo stredu spodnej strany. Po vykreslení štvorčeka sa presunieme do stredu jeho hornej strany, lebo tu sa začne kresliť štvorček nad ním.

Keďže na začiatku nevieme, koľko štvorčekov na kreslenie veže máme k dispozícii, veľkosti štvorčekov si uložíme do zoznamu.

Výsledný kód môže vyzerať nasledovne:  

#Python
import turtle


def kresliStvorec(strana):
    for i in range(4):
        pero.forward(strana / 2)
        pero.left(90)
        pero.forward(strana / 2)


def vymaz_duplicity(strany_stvorcov):
    strany_stvorcov_bez_duplicit = []
    pridana_strana = ''
    for strana in strany_stvorcov:
        if strana != pridana_strana:
            strany_stvorcov_bez_duplicit.append(strana)
            pridana_strana = strana
    return strany_stvorcov_bez_duplicit


def vytvor_vezu(strany_stvorcov):
    strany_stvorcov.sort(reverse=True)
    strany_stvorcov_bez_duplicit = vymaz_duplicity(strany_stvorcov)

    for strana in strany_stvorcov_bez_duplicit:
        pero.right(90)
        pero.pendown()
        kresliStvorec(strana)
        pero.penup()
        pero.left(90)
        pero.forward(strana)

    pero.backward(sum(strany_stvorcov_bez_duplicit))


pero = turtle.Turtle()
tabula = turtle.Screen()

strany_stvorcov = [30, 30, 40, 40, 60, 50]

pero.left(90)
vytvor_vezu(strany_stvorcov)
tabula.mainloop()
V Imagine bude kód vyzerať podobne
;Imagine Logo

viem kresli_stvorec :strana
  opakuj 4 [
    do :strana / 2
    vl 90
    do :strana / 2
  ]
koniec

viem vymaz_duplicity :strany_stvorcov
  urobTu "strany_stvorcov_bez_duplicit []
  urobTu "pridana_strana "
  prePrvky "strana :strany_stvorcov[
    ak :strana <> :pridana_strana[
      urobTu "strany_stvorcov_bez_duplicit vlozPo :strana :strany_stvorcov_bez_duplicit
      urobTu "pridana_strana :strana
    ]
  ]
  vy :strany_stvorcov_bez_duplicit
koniec

viem vytvor_vezu :strany_stvorcov
  urobTu "strany_stvorcov utried :strany_stvorcov
  urobTu "strany_stvorcov prevrat :strany_stvorcov
  urobTu "strany_stvorcov_bez_duplicit vymaz_duplicity :strany_stvorcov
  urobTu "vzdialenost 0

  prePrvky "strana :strany_stvorcov_bez_duplicit[
    vp 90
    pd
    kresli_stvorec :strana
    ph
    vl 90
    do :strana
    urobTu "vzdialenost :vzdialenost + :strana
  ]
  vz :vzdialenost
koniec

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

Túto úlohu riešili dohromady 4 tímy. Jeden tím dosiahol plný počet. Veríme že sa Vám táto úloha páčila a bola pre Vás výzvou.