Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 0 / 2 = 0 %

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

Pri riešení tejto úlohy musíme zohľadniť niekoľko podmienok súčasne:

  • dĺžka strany veľkého štvorca je celočíselným násobkom dĺžky strany malého štvorca, tento násobok je zadaný používateľom, budeme ho označovať ako pomer,

  • vo vzorke sa striedajú malé a veľké štvorce, ktoré sa dotýkajú vrcholmi,

  • vzorka začína aj končí malým štvorcom, platí to pre šírku aj dĺžku obrusu,

  • vzorka začína a končí na okraji obrusu, nie je tam teda žiadne voľné miesto a ani nechýba časť nejakého štvorca,

  • štvorce by mali byť čo najväčšie,

  • pracujme s presnosťou 1 mm pretože to je presnosť tlačiarne, rozmery štvorcov a obrusu by teda mali byť celé milimetre.

Odkiaľ teda začneme úlohu riešiť?

  • začnime hľadať veľkosti štvorcov od najväčšieho a postupne veľkosť zmenšujme,

  • hľadajme veľkosť menšieho zo štvorcov, rozmer veľkého bude jeho celočíselným násobkom,

  • ak nájdeme nejaké rozmery štvorcov, ktoré vyplnia celú šírku obrusu, pokúsme sa vyplniť aj celú dĺžku,

    • ak sa to podarí, máme riešenie,

    • ak sa to nepodarí, skúsme iný, menší rozmer štvorcov, zmenšíme stranu menšieho štvorca o 1 mm,

    • ak by nová dĺžka strany malého štvorca bola menšia ako 1 mm, úloha nemá riešenie.

Od akého rozmeru začneme? Najväčší možný rozmer je taký, že na vyplnenie šírky použijeme dva malé a jeden veľký štvorec.

obrus1 

Označme si hľadanú dĺžku strany malého štvorca x a pomer nech je pomer dĺžok strán štvorcov. Pre šírku potom platí:

x + pomer × x + x = sirka

Po úprave:

x = sirka / (pomer + 2)

Nezabúdajme, že x by malo byť celé číslo (celý počet milimetrov). Výslednú dĺžku zaokrúhlime. Časť programu môže vyzerať nasledovne:

;Imagine logo
viem velkostVzorky :sirka :dlzka :pomer
  urobTu "x cPodiel :sirka (2 + :pomer)
koniec

#Python
def velkostVzorky1(sirka, dlzka, pomer):
    x = sirka // (2 + pomer)

Ďalšou podmienkou je, aby strana malého štvorca bola aspoň 1 mm. Ak x bude aspoň 1 overme, či takto vyplníme celú šírku.

Ak sa pozrieme na opakovanie vzorky zistíme, že sa opakuje dvojica malý a veľký štvorec. Nakoniec sa ešte pridá jeden malý štvorec.

obrus2 

Ak od celej šírky odpočítame stranu malého štvorca, rozdiel musí byť deliteľný súčtom strán malého a veľkého štvorca.

;Imagine logo
viem velkostVzorky :sirka :dlzka :pomer
  urobTu "x cPodiel :sirka (2 + :pomer)
  kym [:x >= 1] [
    ak zvysok (:sirka - :x) (:x + :pomer * :x) = 0 [
      ;vieme, ze vzorka vyplnila celu sirku
    ]
  ]
koniec

#Python
def velkostVzorky1(sirka, dlzka, pomer):
    x = sirka // (2 + pomer)
    while x >= 1:
        print (x)
        if (sirka - x) % (x + pomer * x) == 0:
            #vieme, ze vzorka vyplnila celu sirku

Podobne overíme či vzorka dokáže vyplniť celú dĺžku. Ak áno, máme riešenie: x a x×pomer. Ak nie, zmenšíme stranu malého štvorca o 1 mm a pokračujeme v overovaní. Výsledok môže vyzerať nasledovne: 

;Imagine logo
viem velkostVzorky :sirka :dlzka :pomer
  urobTu "x cPodiel :sirka (2 + :pomer)
  kym [:x >= 1] [
    ak zvysok (:sirka - :x) (:x + :pomer * :x) = 0 [
      ak zvysok (:dlzka - :x) (:x + :pomer * :x) = 0 [
        vysledok zoznam :x :x * :pomer
      ]
    ]
    urobTu "x :x - 1
  ]
koniec

def velkostVzorky1(sirka, dlzka, pomer):
    x = sirka // (2 + pomer)
    while x >= 1:
        print (x)
        if (sirka - x) % (x + pomer * x) == 0:
            #vieme, ze vzorka vyplnila celu sirku
            if (dlzka - x) % (x + pomer * x) == 0:
                return x, pomer * x
        x = x - 1

Všimnime si jednu vec. Podľa zadania má procedúra, resp. funkcia zistiť vhodné rozmery štvorcov. Nikde nie je napísané, čo by s nimi mala spraviť. Môže ich vypísať, môže ich vložiť do nejakého textového políčka a pod. V našom riešení sme sa rozhodli, že procedúra (funkcia) tieto hodnoty vráti. Vráti ich ako dvojicu. V Imagine logu je to zoznam, v Pythone n-tica.

V čom je toto rozhodnutie lepšie? Ak by procedúra (funkcia) výsledok vypísala, už ho nevieme ďalej použiť. Ak procedúra (funkcia) výslednú hodnotu vráti, vieme s touto hodnotou ďalej pracovať. Vieme ju vypísať, vieme ju použiť  ako súčasť ďalších výpočtov a pod. Takto sa procedúra (funkcia) stane univerzálnejšie použiteľnou.

A na koniec ešte jedna poznámka. Ak riešenie neexistuje, procedúra (funkcia) vráti prázdny zoznam (n-ticu). Možeme to chápať podobne ako v matematike. Ak úloha nemá riešenie, riešením je prázdna množina.

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

Na riešenie tejto úlohy sa nepodujal nikto.