Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 31 / 49 =  63.27 %

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

Pre výpočet ťažiska celého lustra potrebujeme vypočítať ťažisko mriežky aj ťažisko podložky.

Mriežka pozostáva z náhodne vybraných úsečkových segmentov umiestnených v štvorcovej mriežke 10x10 malých štvorčekov.

Ťažisko každého z 300 úsečkových segmentov vypočítame pomocou funkcie vypocet_taziska():

# Python
def vypocet_taziska(x1, y1, x2, y2, m1=1, m2=1):
    ''' výpočet ťažiska dvoch telies so zadanými hmotnosťami a súradnicami, 
    resp. úsečky so zadanými súradnicami krajných bodov
    '''
    xt = (x1 * m1 + x2 * m2) / (m1 + m2)
    yt = (y1 * m1 + y2 * m2) / (m1 + m2)
    return xt, yt

Pri výpočte ťažiska mriežky môžeme postupovať dvomi spôsobmi:

  1. najprv vypočítame ťažisko 2 segmentov, potom z neho ťažisko 3 segmentov, ... až napokon ťažisko 300 segmentov

  2. vypočítame súčet x-ových a súčet y-ových súradníc všetkých segmentov, ktorý predelíme počtom segmentov

Vyberieme si druhý spôsob a výpočet urobíme v rámci funkcie tlac_vzor(), kde do tela vnorených cyklov do jednotlivých podmienok za vykresľovanie úsečkového segmentu so súradnicami (x + 10, y + 10, x + a, y + b) doplníme výpočet ťažiska segmentu (x + 10, y + 10, x + a, y + b). X-ové a y-ové súradnice ťažísk segmentov postupne sčítame a po vnorených cykloch vypočítame ťažisko celej mriežky ako podiel súčtu x-ových resp. súčtu y-ových s počtom segmentov, čo vynesieme ako výsledok tejto funkcie.

Ťažisko štvrcovej podložky s rozmermi 200x200 bodov s počiatkom (0,0) bude v jej strede t.j. v bode (100, 100).

Napokon ťažisko celého lustra vypočítame ako ťažisko dvoch telies - mriežky s 300 segmentmi a podložky pomocou funkcie vypocet_taziska(). Výsledné riešenie môže vyzerať nasledovne:

# Python
import random
import turtle


def useckovy_segment(x1, y1, x2, y2):
    ''' vykreslenie úsečky zadanej súradnicami jej krajných bodov
    '''
    pero.penup()
    pero.setposition(x1, y1)
    pero.pendown()
    pero.setposition(x2, y2)


def mriezka():
    ''' vykreslenie sivej štvorcovej mriežky s 10x10 štvorčekovými políčkami
    '''
    pero.pensize(1)
    pero.pencolor('lightgray')
    for i in range(0, 201, 20):
        useckovy_segment(0, i, 200, i)
        useckovy_segment(i, 0, i, 200)


def vypocet_taziska(x1, y1, x2, y2, m1=1, m2=1):
    ''' výpočet ťažiska dvoch telies so zadanými hmotnosťami a súradnicami, 
    resp. úsečky so zadanými súradnicami krajných bodov
    '''
    xt = (x1 * m1 + x2 * m2) / (m1 + m2)
    yt = (y1 * m1 + y2 * m2) / (m1 + m2)
    return xt, yt


def tlac_vzor():
    ''' vykreslenie náhodného vzoru so zelenými úsečkovými segmentmi
    a výpočet ťažiska všetkých úsečkových segmentov
    '''
    pero.pensize(2)
    pero.pencolor('green')
    pocet = 0
    sucet_x = 0
    sucet_y = 0
    for x in range(0, 200, 20):
        for y in range(0, 200, 20):
            nahoda = random.randint(1, 4)
            if nahoda != 1:
                useckovy_segment(x + 10, y + 10, x, y)
                pocet += 1
                sucet_x += vypocet_taziska(x + 10, y + 10, x, y)[0]
                sucet_y += vypocet_taziska(x + 10, y + 10, x, y)[1]
            if nahoda != 2:
                useckovy_segment(x + 10, y + 10, x, y + 20)
                pocet += 1
                sucet_x += vypocet_taziska(x + 10, y + 10, x, y + 20)[0]
                sucet_y += vypocet_taziska(x + 10, y + 10, x, y + 20)[1]
            if nahoda != 3:
                useckovy_segment(x + 10, y + 10, x + 20, y)
                pocet += 1
                sucet_x += vypocet_taziska(x + 10, y + 10, x + 20, y)[0]
                sucet_y += vypocet_taziska(x + 10, y + 10, x + 20, y)[1]
            if nahoda != 4:
                useckovy_segment(x + 10, y + 10, x + 20, y + 20)
                pocet += 1
                sucet_x += vypocet_taziska(x + 10, y + 10, x + 20, y + 20)[0]
                sucet_y += vypocet_taziska(x + 10, y + 10, x + 20, y + 20)[1]
    return sucet_x, sucet_y, pocet


def tazisko_lustra():
    ''' výpočet ťažiska celého lustra tvoreného mriežkou 
        s úsečkovými segmentmi a podložkou
    '''
    x1t, y1t = tlac_vzor()  # ťažisko mriežky
    x2t, y2t = 100, 100  # ťažisko podložky
    xt, yt = vypocet_taziska(x1t, y1t, x2t, y2t)
    return xt, yt


pero = turtle.Turtle()
plocha = turtle.Screen()
plocha.delay(0)
pero.speed(0)
pero.hideturtle()

mriezka()
print(tazisko_lustra())

plocha.mainloop()

Táto úloha je zameraná na:

  • použitie stratégie riešenia problémov - dekompozície problému na podproblémy,

  • precvičenie príkazov volania funkcií s parametrom a výstupom, práce s dátovým typom n-tica, výpočtov s aritmetickými operátormi,

  • aplikáciu fyzikálnych poznatkov (výpočet ťažiska sústavy viacerých telies) na algoritmické vyriešenie reálneho problému.

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

Do riešenia tejto úlohy sa zapojilo 31 tímov z kategórie GURU. Plný počet bodov dosiahli tímy acubed, file-open, ojoj a sigma, ktorým gratulujeme.

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:

  • namiesto súradníc x, boli nesprávne použité aktuálne súradnice grafického pera xcor,
  • pri výpočte ťažiska mriežky niektorí zabudli predeliť súčty x-ových a y-ových súradníc predeliť počtom úsečiek (300),
  • niektorí vyriešili len výpočet mriežky, nie celého lustra včítane podložky,
  • výpočet zarátajúci nesprávne aj 22 úsečiek, tvoriacich rám mriežky10x10 štvorčekov,
  • nesprávna úvaha započítať do výpočtu ako 101. prvok ťažisko podložky, bez použitia váženého aritmetického priemeru,
  • v riešení v podmienkach boli namiesto hodnôt +-5 a +-15 uvedené 35/3 resp 25/3,
  • pri riešení trojsegmentov zlý výpočet ťažiska,
  • v niektorých riešeniach sa nezohľadňovali hodnoty segmentov.