Zatiaľ čo je Lukáš zaneprázdnený ťažkou prácou, chúďa Julka nemá dosť peňazí na cukríky a čokoládu. Rozhodla sa túto nespravodlivosť napraviť a preto využila svoj talent na stavanie obvodov do herných automatov.
Táto úloha je interaktívna. Na tejto stránke nájdeš herné automaty v podobe logických obvodov. Stránka vie automaticky overiť, či tvoj program správne rieši nejakú úlohu. Ako popis odovzdaj tvoje obvody, ktoré odovzdáš na stránke s obvodmi, nemusíš k nim písať nič viac. Prosím pošli nám fotku každého obvodu, nech vieme overiť, že sú naozaj správne.
Brány fungujú tak, že v každom okamihu zoberú vstup a v tom ďalšom okamihu sa im podľa toho zmení výstup. Môžeme si to teda predstaviť tak, že chceme pomocou brán z aktuálneho stavu vypočítať ten ďalší. Keď si toto uvedomíme, môžeme sa pustiť do riešenia jednotlivých podúloh.
Keď chceme prerozprávať zadanie do reči brán, tak môžeme povedať, že žiarovka má byť zapnutá vtedy, ak je stlačené tlačítko, alebo ak bola zapnutá už minule. A to nám už rovno dá návod, ako postaviť obvod:

Chceme vlastne spraviť niečo podobné ako minule, teda začneme tým, že pri stlačení tlačítka zapneme žiarovku. Ak bola zapnutá, tak ju budeme chcieť zapnúť znovu, ale chceme to zapnutie nejak zdržať. Na to nám stačí zapojiť do cesty zopár predlžovačiek (ktoré iba prenesú vstup na výstup, ale s oneskorením jeden okamih).

Zase sa musíme spýtať otázku “kedy má byť svetlo zapnuté” a odpovedať v reči brán a minulého stavu. Takže, svetlo má byť zapnuté, ak bolo stlačené zapínacie tlačítko alebo svetlo už svietilo, ale zároveň nebolo stlačené vypínacie tlačítko.
Človek by si teda myslel, že bude fungovať takýto obvod:

Ale keď si tento obvod vyskúšame pustiť, zistíme, že keď zapneme svetlo, tak miesto aby ostalo zapnuté, tak začne blikať. (Ehm, teda aspoň tak sa to stalo mne, keď som písal tento vzorák.) Problém je presne v tom, že trvá jeden okamih, kým brána spracuje svoj vstup. Takže vstup pre bránu a, ktorý by mal byť “žiarovka bola zapnutá minule alebo je stlačené tlačítko”, v skutočnosti znamená “žiarovka bola zapnutá predminule alebo bolo stlačené tlačítko minule”.
To, čo sme chceli urobiť, sa bohužiaľ nedá, lebo jednoducho nie je možné, aby informácia tom, či bola zapnutá žiarovka, cestovala tak rýchlo.
Ak sa vám ale toto stalo a skúšali ste sa hrať aj s takýmto pokazeným obvodom, možno ste si všimli, že keď stlačíte zapínacie tlačítko viackrát za sebou, tak sa niekedy podarí žiarovku trvalo zapnúť. A potom zase keď stlačíte vypínacie tlačítko raz, tak žiarovka začne blikať, ale keď ho postláčate viackrát, možno zhasne úplne.
Predtým sme totiž mali problém, že žiarovka berie svoj “bývalý” stav až z predminulého okamihu. Ale nám nevadí to oneskorenie - máme časový limit až 8 okamihov a úplne bez oneskorenia by to ani nešlo. Nám vadí to, že žiarovka “zabudne” svoj minulý stav a pamätá si až predminulý.
Čo nám teda stačí spraviť, je “podržať” zapínacie tlačítko trochu dlhšie, na dva okamihy. Tým zapneme žiarovku dvakrát po sebe, takže potom aj keď pustíme tlačítko, už aj jej predminulý stav bude zapnutý, nielen minulý. To isté platí aj pre vypínacie tlačítko.
Stačí teda spraviť, aby sa každé tlačítko akoby stlačilo dvakrát po sebe. Teda ten vstup má byť zapnutý, ak bolo stlačené tlačítko teraz alebo minule, a to už vieme postaviť.

Zase spravíme najprv takú nie úplne funkčnú verziu, aby sme lepšie pochopili, čo vlastne treba spraviť.
Takže svetlo má byť zapnuté, ak bolo zapnuté minule alebo bolo stlačené tlačítko, ale nie obe naraz (vtedy sa má práveže vypnúť).
Z toho dostaneme takýto (nefunkčný) obvod.

Okrem problému s celkovým oneskorením ako minule tu máme ešte jeden iný problém: výstup z brány a na konci sa dáva naspäť na dve miesta, ale cez tú hornú vetvu sa dostane naspäť za dva okamihy a cez tú spodnú až za tri! Ako už vieme z predošlej podúlohy, nejakému oneskoreniu sa nevieme vyhnúť, ale bolo by fajn, keby to oneskorenie pri spätnej väzbe bolo všade rovnaké, aby sme nemiešali vstupy z rôznych časov v minulosti. Teraz to teda môžeme vyriešiť tak, že pridáme aj do hornej vetvy jedno oneskorenie.

No a teraz už iba máme ten istý problém ako minule - tlačítko si pamätá iba stav až tri kroky dozadu. Takže to vyriešime tým, že zo stlačenia tlačítka na jeden okamih urobíme tri okamihy, aby sa obvod stihol dostať do správneho stavu.
Tak tu máme konečne správny obvod:

Súťaž PRASK zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre stredoškolákov
Tímová matematicko-fyzikálna súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania