Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 18 / 22 = 82%

  • Úspešnosť riešenia: 5,06 / 7 =  72%

Semafor sme si položili do karteziánskej sústavy, teda do sústavy X a Y súradníc. Kresliť začíname v bode [0,0]. Zo zadania poznáme:

  • šírku semafora,
  • výšku semafora, ktorá je rovná trojnásobku šírky semafora,
  • priemer svetla semafora, ktorý je polovicou šírky semafora.
Nakreslenie vhodného obrázku nám pomôže odhaliť ďalšie súvislosti:

popis semafora

Z obrázku vieme vyčítať súradnice bodov, v ktorých začneme kresliť svetlá semafora. Pre svtlá semafora teda platí:

  • X1 = svetlá majú rovnakú pozíciu na X-ovej osi, ktorá je od počiatočného bodu [0,0] vzdialená na osi X 1/2 šírky semafora. Hodnotu tejto X-ovej súradnice uložíme do premennej surX.
  • Y1 = ypsilónová súradnica prvého svetla je od počiatočného bodu vzdialená na osi Y vzdialenosťou
    1/6 výšky semafora. Toto svetlo bude svietiť zelenou farbou, uložíme teda túto súradnicu do
    premennej surYZelena.
  • Y2 = ypsilónová súradnica druhého svetla je od počiatočného bodu vzdialená na osi Y vzdialenosťou 3/6 výšky semafora. Toto svetlo bude svietiť oranžovou farbou, uložíme teda túto súradnicu do premennej surYOranzova.
  • Y3 = ypsilónová súradnica tretieho svetla je od počiatočného bodu vzdialená na osi Y vzdialenosťou 5/6 výšky semafora.Toto svetlo bude svietiť červenou farbou, uložíme teda túto súradnicu do premennej surYCervena
Jednotlivé ypsilónové súradnice svetiel semafora si môžete odvodiť aj iným matematickým spôsobom. Napríklad Y2 súradnica oranžového svetla je od počiatočného bodu vzdialená na osi y vziadlenosťou 1/2 výšky semafora.

Teraz už vieme všetky podstatné súradnice, môžeme teda nakresliť semafor a aj jeho svetlá. Stačí ak sa korytnačka bude pohybovať po zadaných súradniciach. Vytvoríme si najskôr procedúru NakresliSemafor (), ktorá vykreslí obrys semafora pomocou týchto súradníc:

   [0,0], [0,výškaSemafora], [šírkaSemafora,výškaSemafora], [šírkaSemafora,0].

Na kreslenie jednotlivých svetiel semafora sme si v autorskom riešení vytvorili procedúru NakresliSvetlo (farba, xSur, ySur, priemerSvetla), ktorá má na vstupe parametre xovej a ypsilónovej súradnice, farbu a priemer kresleného svetla. Svetlá najskôr vykreslíme čiernou farbou, ktorá značí vypnutý semafor. Až potom postupne vykreslujeme farebné svetla podľa poradia.Pri vypínaní svetla ho zasa zafarbíme čiernou farbou.

Sveltá na semaforoch svietia v nasledujúcom poradí:

  1. Svieti červené svetlo. Ostatné svetlá sú vypnuté.
  2. Svieti červené aj oranžové svetlo. Zelené svetlo je vypnuté.
  3. Svieti zelené svetlo. Ostatné svetlá vypnuté.
  4. Svieti oranžové svetlo. Ostatné svetlá sú vypnuté.
Uvedené striedanie svetiel sa opakuje po zvolenom časovom intervale.

Video zaznamenáva správne striedanie svetiel semafora.

Striedanie svetiel semafora nám zabezpečuje procedúra striedajFarby(), ktorá jednotlivé svetlá semafora prekresľuje v nekonečnom cykle. Našou hlavnou procedúrou je však procedúra semafor(sirkaSemafora), ktorá v stanovenom poradí volá ostatné, už spomenuté procedúry.

Autorské riešenie v jazyku Imagine logo

;Imagine logo
viem nakresliSemafor :sirkaSemafora :vyskaSemafora
; procedúra, ktorá vykreslí obrys semafora
  nechFP "cierna
  skry
  nechXYSur 0 0
  nechXYSur 0 :vyskaSemafora
  nechXYSur :sirkaSemafora :vyskaSemafora)
  nechXYSur :sirkaSemafora 0
  nechXYSur 0 0
koniec

viem nakresliSvetlo :Xsuradnica :Ysuradnica :priemerSvetla :farba
;procedúra, ktorá nakreslí svetlo semafora na zadaných súradniciach, so zvolenou      
farbou a priemerom
  ph
  nechXYSur :Xsuradnica :Ysuradnica
  pd
  nechFP :farba
  bod :priemerSvetla
koniec

viem striedajFarby
;procedúra, ktorá umožňuje striedanie svetiel semafora
  stále [
    nakresliSvetlo :surX :surYCervena :priemer "cervena
    nakresliSvetlo :surX :surYZelena :priemer 0
    nakresliSvetlo :surX :surYOranzova :priemer 0
    cakaj 2000
    nakresliSvetlo :surX :surYOranzova :priemer "oranzova
    cakaj 1000
    nakresliSvetlo :surX :surYZelena :priemer "zelena
    nakresliSvetlo :surX :surYOranzova :priemer 0
    nakresliSvetlo :surX :surYCervena :priemer 0
    cakaj 2000
    nakresliSvetlo :surX :surYZelena :priemer 0
    nakresliSvetlo :surX :surYOranzova :priemer "oranzova
    nakresliSvetlo :surX :surYCervena :priemer 0
    cakaj 1000
  ]
koniec

viem semafor :sirkaSemafora
;hlavná procedúra, ktorá nám vykreslí funkčný semafor
  urobTu "vyskaSemafora 3*:sirkaSemafora
  urobTu "priemer :sirkaSemafora/2
  urobTu "surX :sirkaSemafora/2
  urobTu "surYZelena 1*:vyskaSemafora/6
  urobTu "surYOranzova 3*:vyskaSemafora/6
  urobTu "surYCervena 5*:vyskaSemafora/6
  nakresliSemafor :sirkaSemafora :vyskaSemafora
  nakresliSvetlo :surX :surYZelena :priemer "cierna
  nakresliSvetlo :surX :surYOranzova :priemer "cierna
  nakresliSvetlo :surX :surYCervena :priemer "cierna
  striedajFarby
koniec

 

Autorské riešenie v jazyku Python

#python
import turtle
import time

korytnacka = turtle.Turtle()
korytnacka.speed(0)
korytnacka.hideturtle()
korytnacka.penup()

plocha = turtle.Screen()


def semafor(sirkaSemafora):
    """
    hlavná procedúra
    :type:
    :param sirkaSemafora:
    :rtype : object
    :return:
    """


    def nakresliSemafor():
        """
        procedúra, ktorá nakreslí obrys semafora
        :type:
        :param:
        :rtype : object
        :return:
        """

        korytnacka.pendown()
        korytnacka.setpos(0, vyskaSemafora)
        korytnacka.setpos(sirkaSemafora, vyskaSemafora)
        korytnacka.setpos(sirkaSemafora, 0)
        korytnacka.setpos(0, 0)
        korytnacka.penup()
        nakresliSvetlo("black", surX, surYCervena, priemerSvetla)
        nakresliSvetlo("black", surX, surYOranzova, priemerSvetla)
        nakresliSvetlo("black", surX, surYZelena, priemerSvetla)

    def nakresliSvetlo(farba, xSur, ySur, priemerSvetla):
        '''
        procedúra, ktorá nakreslí na zadaných súradniciach
        svetlo zvolenej farby a priemeru
        :type:
        :param farba:
        :param xSur:
        :param ySur:
        :param priemerSvetla:
        :rtype : object
        :return:
        '''

        korytnacka.setpos(xSur, ySur)
        korytnacka.color(farba)
        korytnacka.dot(priemerSvetla)

    def striedajFarby():
        """
        procedúra, ktorá umožňuje striedanie farebných svetiel semafora
        :type:
        :param:
        :rtype : object
        :return:
        """

        while True:
            nakresliSvetlo("red", surX, surYCervena, priemerSvetla)
            nakresliSvetlo("black", surX, surYOranzova, priemerSvetla)
            time.sleep(2)
            nakresliSvetlo("orange", surX, surYOranzova, priemerSvetla)
            time.sleep(0.5)
            nakresliSvetlo("black", surX, surYCervena, priemerSvetla)
            nakresliSvetlo("black", surX, surYOranzova, priemerSvetla)
            nakresliSvetlo("green", surX, surYZelena, priemerSvetla)
            time.sleep(2)
            nakresliSvetlo("orange", surX, surYOranzova, priemerSvetla)
            nakresliSvetlo("black", surX, surYZelena, priemerSvetla)
            time.sleep(0.5)

    korytnacka.setpos(0, 0)
    vyskaSemafora = 3 * sirkaSemafora
    priemerSvetla = sirkaSemafora / 2
    surX = sirkaSemafora / 2
    surYZelena = 1 * vyskaSemafora / 6
    surYOranzova = 3 * vyskaSemafora / 6
    surYCervena = 5 * vyskaSemafora / 6

    nakresliSemafor()
    striedajFarby()


semafor(70)

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

Vaše najčastejšie chyby spočívali v zle prečítanom zadaní úlohy:

  • časté bolo zlé striedanie farieb semafora, mnohí z Vás si neuvedomili, že na semafore môže svietiť v jednom okamihu červené a oranžové svetlo súčasne,
  • veľa chýb bolo spôsobených hlavne nepozorným čítaním zadania úlohy - často ste vykreslili vypnuté svetlo inou ako čiernou farbou,
  • veľa bodov sme museli strhnúť aj za nepoužitie parametru šírky semafora,
  • mnohí z Vás striedali farby semafora pomocou cyklu for, ktorý má však konečný počet opakovaní. Ako by to v Korytnačkove vyzeralo, keby semafor prestal fungovať po 10 sekundách? :)
Veľmi ste nás potešili snahou vytvoriť prijateľné používateľské rozhranie. Najzaujímavejšie rozhranie vytvorila skupina riešiteľov v jazyku Python, tím JM&JM, ktorí ošetrili zastavenie nekonečného cyklu stlačením kombinácie klávesov. Dokonca vytvorili aj triedu, ktorá reprezentuje stav semafora. Mnoho riešení bolo zaujímavých aj v jazyku Imagine.Vytvorili ste veľa semaforov, ktorých svetlá mali obrys, pričom ste brali do úvahy aj hrúbku obrysu svetla.Hoci bolo riešenie z programátorského hľadiska správne, trebalo brať do úvahy znenie zadania a farbu vypnutého svetla zvýrazniť čiernou farbou. Farbu obrysu ste mohli dať ľubovoľnou farbou, keďže sa v zadaní nespomína. Veľmi nás potešilo,že ste sa rozhodli svoj kód komentovať a prehľadne zapísať.Určite pokračujte v tomto trende aj v nasledujúcom kole!