Ak máte akékoľvek otázky ohľadom tejto úlohy napíšte Peťovi na [email protected]
Vedci v Bajtlandí sa snažia skonštruovať prvý prototyp Bajtlandského počítača, ale zatiaľ sa im v tom príliš nedarí. Už však vynašli jednoduché stroje, ktoré dokážu pracovať s páskami so 16 ciframi. V Bajtlandii poznajú iba jednotky a nuly a preto si každú pásku môžete predstaviť ako postupnosť 16 jednotiek a núl. Stroje fungujú tak, že do nich vložíte jednu alebo dve pásky a oni vytlačia novú pásku.
Zatiaľ vedci vynašli štyri typy strojov:
& – AND – stroj:
Do tohto stroja vložíte dve pásky a stroj vytlačí pásku, kde bude 1 iba na tej pozícii, kde bola 1 v oboch páskach. Na ostatných miestach bude 0.
Príklad: Do stroja vložíme pásku A a pásku B:
Páska A: 0011100111101101
Páska B: 1010010101010110
Stroj vytlačí pásku: 0010000101000100
! – NOT – stroj:
Do tohto stroja vložíte jednu pásku a stroj vytlačí pásku, v ktorej je každá 1 vymenená za 0 a každá 0 vymenená za 1.
Príklad:
Do stroja vložíme pásku: 0100011010100101
Stroj vytlačí pásku: 1011100101011010
<< – LSHITF – stroj:
Do tohto stroja vložíte jednu pásku a ešte kladné číslo \(k\). Stroj potom posunie každú cifru na páske o \(k\) pozícií doľava, vynechá prvých \(k\) cifier a posledných \(k\) cifier zaplní nulami.
Príklad:
k=5:
Do stroja vložíme pásku: 1011010001011110
Posunutie: 1011010001011110
Stroj vytlačí pásku: 1000101111000000
>> – RSHITF – stroj:
Podobný ako stroj LSHIFT
. Opäť doňho vkladáme jednu pásku a kladné číslo \(k\). Stroj potom posunie každú cifru o \(k\) pozícií doprava, vynechá posledných \(k\) cifier a prvých \(k\) cifier zaplní nulami.
Príklad:
k=5:
Do stroja vložíme pásku: 1011010001011110
Posunutie: 1011010001011110
Stroj vytlačí pásku: 0000010110100010
Spájanie
Bajtlandskí vedci dokážu spájať rôzne stroje dokopy, čím dokážu vyrábať komplikovanejšie prístroje. Takéto spájania potom zapisujú formou jednoduchého programu. Napríklad nasledujúci program zoberie dve pásky A
a B
, postupne vyrobí pásky C
, D
a E
a pásku E
vytlačí ako výsledok.
Príklad:
C= !B //použi stroj NOT na pásku B. Výslednú pásku nazvi C
D= A & C //skombinuj pásku C a A pomocou stroja AND. Výslednú pásku nazvi D
E= !D //použi stroj NOT na pásku D. Výslednú pásku nazvi E
Vytlač E //stroj vytlačí finálnu pásku E
Na novo vytlačenej páske bude 0 práve na tých pozíciach, kde bola na páske A
1 a na páske B
0, na ostatných bude 1.
Stroje môžu používať aj dopredu vyrobené pásky. Napríklad, keď by sme chceli spraviť stroj, ktorý načíta pásku A
a vytlačí pásku, kde sa každá 1 v posledných 8 číslach zmení na 0, tak to vieme spraviť aj nasledovne:
B= (0000000011111111) << 8 //v premenej B bude páska posunutá o osem miest,
//teda 1111111100000000
C= A & B //v premennej A je vstupná páska
Vytlač C
Úloha
K dispozícii máte štyri základné stroje !
, &
, <<
, >>
a ľubovoľné konštantné pásky (pozri posledný príklad). Vašou úlohou je s ich pomocou vyrobiť niekoľko komplikovanejších prístrojov. Pre každú podúlohu napíšte program, ktorý popisuje ako zostaviť požadovaný prístroj a tiež pridajte aspoň krátky slovný popis, prečo je vaše riešenie správne.
“Programovací jazyk”, v ktorom píšete stroje nie je presne daný. Skúste používať niečo podobné tomu, čo ste videli v predchádzajúcich príkladoch. Aj dostatočný slovný popis, ako poskladať žiadaný stroj však bude postačujúci. Hlavne nech je jasné, ako ste to robili.
a) (2 body) OR – stroj
Do stroja vložíte dve pásky A
a B
. Výstupná páska má mať 0 na tých pozíciách, na ktorých mali obe pásky A
a B
0, a 1 na zvyšných.
Príklad:
Do stroja vložíme pásku A
a pásku B
:
Páska A: 0011100100100010
Páska B: 1010010110101101
Stroj vytlačí pásku: 1011110110101111
b) (2 body) XOR – stroj
Dnu vložíme dve pásky A
a B
. Výstupná páska bude mať 1 na tých pozícicáh, na ktorých sa pásky A
a B
líšili a 0 na tých, kde boli rovnaké.
Príklad:
Do stroja vložíme pásku A a pásku B:
Páska A: 0011100100100010
Páska B: 1010010110101101
Stroj vytlačí pásku: 1001110010001111
c) (3 body) SEL – stroj
Máte pásku A
a číslo \(k\). Vytvorte stroj, ktorý zmení všetky 1, okrem tej na \(k+1\)-vej pozícii, na 0. Ak na pozícii \(k+1\) nie je 1, výstupom bude páska so samými 0.
Príklady:
k=5:
Do stroja vložíme: 1110010111100101
Stroj vytlačí pásku: 0000000000100000
k=3:
Do stroja vložíme: 1110010111100101
Stroj vytlačí pásku: 0000000000000000
d) (4 body) RAO – stroj
Vytvorte stroj, ktorý zoberie jednu pásku A
a zmení všetky 1, ktoré nesusedia s inou 1, na 0.
Príklad:
Vstup: 1110010111101101
Výstup: 1110000111101100
e) (4 body) RM – stroj
Stroj dostane pásku A
. Následne z každého súvislého úseku 1 nechá iba tie na okrajoch a zvyšné zmení na 0. Môžete predpokladať, že prvá aj posledná cifra pásky je 0.
Príklad:
Vstup: 0110010111101110
Výstup: 0110010100101010
Odovzdávanie
Na odovzdávanie sa musíš prihlásiť
Otázky a diskusia
Po skončení kola budete mať príležitosť na diskutovanie o riešeniach v diskusii pod vzorovým riešením.