Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 8 / 13 = 62%

  • Úspešnosť riešenia:  4,8 / 6 = 80%

Úlohu si môžeme rozdeliť na niekoľko častí:

  • načítanie rozmerov obrazov (prípadne zistenie ich počtu),
  • zistenie šírky zadaných obrazov,
  • test existencie riešenia v závislosti od zistenej šírky a výšky,
  • výpočet rozostupov medzi obrazmi,
  • vykreslenie jedného obrazu (obdĺžnik vrátane útvarov v jeho vnútri),
  • vykreslenie všetkých obrazov.

Rozmery obrazov je výhodné uchovávať pomocou dvojrozmerného zoznamu. Pri zisťovaní šírky zadaných obrazov vyberáme z dvojrozmerného zoznamu iba prvky prislúchajúce šírke, napríklad príkazom prvy prvok pocitadlo :z (Imagine) alebo príkazom z[i][0] (Python). Pri teste existencie riešenia musíme brať do úvahy aj medzery medzi obrazmi, napríklad príkazmi ak (:sucetSirok + ((pocet :z)-1) <= :sirkaPlochy) (Imagine) alebo if sucetSirok + (len(z)-1) <= 800 (Python). Podmienka na test výšky je jednoduchá, pretože požadujeme výšku menšiu rovnú ako 200. V prípade, že riešenie existuje, rozostupy nájdeme pomocou šírky obrazov a počtu obrazov, napríklad urob "rozostup cpodiel (:sirkaPlochy - :sucetSirok) ((pocet :z) - 1) (Imagine) alebo rozostup = (800 - sucetSirok) / (len(z)-1) (Python).

Samotné vykreslenie obrazov a umelecké diela v ich vnútri by už mali byť po zvládnutí týchto úvah jednoduchou záležitosťou.

Nasledujú možné riešenia v jazyku Imagine Logo a Python.

;Imagine logo
viem obraz :sirka :vyska
   pd
   nechHP 1
   opakuj 2 [
     vp 90
     do :sirka
     vp 90
     do :vyska
   ]
   nechHP 1
   vp 90
   do :sirka / 2 vp 90
   do :vyska/4 ph do :vyska/4 nechFP ? kruh :vyska/8
   nechFP "cierna do :vyska/4 pd do :vyska/4 vp 90
   do :sirka / 2 vp 90 do :vyska / 2 vp 90
   do :sirka / 3 ph do :sirka / 3 pd do :sirka / 3
   ph vz :sirka
   vl 90 do :vyska /2
koniec
  
viem testRiesenia
   urob "sucetSirok 0
   urob "maxVyska 0
   opakuj pocet :z [
     urob "sucetSirok :sucetSirok + prvy prvok pocitadlo :z
     ak (:maxVyska < posledny prvok pocitadlo :z) [
       urob "maxVyska posledny prvok pocitadlo :z
       ]
   ]
   pis :sucetSirok
   pis :maxVyska
   urob "existujeRiesenie "nie
   urobTu "sirkaPlochy (prvok 1 stranka1'velkost) - 10
   ak (:sucetSirok + ((pocet :z)-1) <= :sirkaPlochy) [
     ak (:maxVyska <= 200) [
       urob "existujeRiesenie "ano
     ]
   ]
   pis :existujeRiesenie
koniec

viem kresli
   znova skry ph nechPoz [-395 200]
   urob "z [[60 200] [20 60] [40 170] [100 100] [200 50]]
   testRiesenia
   ak2 :existujeRiesenie = "ano [
     urobTu "sirkaPlochy (prvok 1 stranka1'velkost) - 10
     urob "rozostup cpodiel (:sirkaPlochy - :sucetSirok) ((pocet :z) - 1)
     pis :sirkaPlochy
     opakuj pocet :z [
       obraz prvy prvok pocitadlo :z posledny prvok pocitadlo :z
       vp 90
       do 1+ :rozostup + prvy prvok pocitadlo :z
       vl 90
     ]
   ]
   [pis "nemaRiesenie]
koniec

 

#python

import turtle
span style="color:#069;font-weight:700">import random
kor = turtle.Turtle();
plocha = turtle.Screen();

def obraz(sirka,vyska):
   '''
   :param sirka - sirka obdlznika, vyska - vyska obdlznika
   :type float
   :return
   :rtype:
   '''

   kor.pendown()
   for i in range(2):
     kor.right(90)
     kor.forward(sirka)
     kor.right(90)
     kor.forward(vyska)
    
   kor.right(90)
   kor.forward(sirka/2)
   kor.right(90)
   kor.forward(vyska/4)
   kor.penup()
   kor.forward(vyska/4)
   farba = random.choice(('red', 'blue', 'green', 'yellow', 'brown'))
   kor.pencolor(farba)
   kor.dot(vyska/8)
   kor.pencolor('black')
   kor.forward(vyska/4)
   kor.pendown()
   kor.forward(vyska/4)
   kor.right(90)
   kor.forward(sirka/2)
   kor.right(90)
   kor.forward(vyska/2)
   kor.right(90)
   kor.forward(sirka/3)
   kor.penup()
   kor.forward(sirka/3)
   kor.pendown()
   kor.forward(sirka/3)
   kor.penup()
   kor.forward(-sirka)
   kor.left(90)
   kor.forward(vyska/2)
    
# vykresli obrazy
  def kresli(z):
   '''
   :param z - zoznam dvojíc - šírka a výška obrazov
   :type list
   :return
   :rtype:
   '''

   plocha.screensize(800,500)
   kor.hideturtle()
   kor.left(90)
   kor.penup()
   kor.setpos(-395,200)
   sucetSirok = 0
   maxVyska = 0
   for i in range(len(z)):
     sucetSirok = sucetSirok + z[i][0]
     if (maxVyska < z[i][1]):
       maxVyska = z[i][1]
   existujeRiesenie = "nie"
   if sucetSirok + (len(z)-1) <= 800:
     if maxVyska <= 200:
       existujeRiesenie = "ano"
  
   if existujeRiesenie=="ano":
     rozostup = (800 - sucetSirok) / (len(z)-1)
     kor.penup()
     for i in range(len(z)):
       obraz(z[i][0],z[i][1])
       kor.right(90)
       kor.forward(rozostup+z[i][0]+1)
       kor.left(90)
   else:
     print("Uloha nema riesenie")

z = [[60, 200], [20, 60], [40,170], [100, 100], [300, 50]]
kresli(z)
plocha.mainloop();

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

Úlohu riešilo 8 tímov, všetky v jazyku Imagine. Väčšina tímov úlohu riešila správne až na chýbajúce testovanie podmienky, či sa všetky obrazy zmestia na stenu (menej ako šírka korytnačej plochy. Výničmočne chýbali medzery medzi obrazmi. Objavilo sa aj riešenie, ktoré kreslilo obrazy s pevnými medzerami, pričom sa testovala podmienka, či sme už nenarazili na pravý okraj korytnačej plochy.