Autorské riešenie
Úlohu si môžeme rozdeliť na niekoľko častí:
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. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |