Programozó versenyek

DEIK Regionális Programozó Csapatverseny, középiskolai kategória, 2023. december 3.

2023. december 3. 10:00 – 2023. december 3. 15:30

Brainf.ck

Minden programozó hallott már a "klasszikus" programozási nyelvekről (C, C++, C#, Java, Python,...), ám kevesebben tudják, hogy léteznek ún. "ezoterikus" nyelvek is. Ezek egy része csupán a készítő szórakoztatása végett jött létre, néhány pedig "erőfitogtatás-céljából". Ezen nyelvek közé sorolható a híres-hirhedt brainf.ck programozási nyelv is. A mi feladatunk egy fordítót/interpretert írni, mely képes az ezen a nyelven megírt programkódokat futtatni. A nyelv szabályai:

  • Az egész kód egy ún. körkörös szalagon fut, melynek az egyes cellái 1-1 byte-nyi adatot tudnak tartalmazni (0-255-ig egy szám). Ezen szalagon van az ún. "olvasófejünk" mely mindig pontosan egyetlen cella fölött található. A körkörösség lényege, hogy amint elérünk az utolsó celláig az elejére ugrunk. Hasonlóképp a legelső cella előtt az utolsó van. Az összes cella értéke alapállapotban 0 és az olvasófej az elején a 0. cella fölött található.
  • A cellák indexelése 0-val kezdődik és egyesével nő.
  • A programkód az alábbi karaktereket tartalmazhatja:
    • < és > jelek, melyek az "olvasófejet" mozgatják a szalagon egy lépéssel balra-jobbra
    • + és - jelek, melyek az éppen vizsgált cella értékét növelik/csökkentik 1-el "körkörösen" (tehát 0 előtt a 255 van és 255 után a 0)
    • . ami az adott cella értékét írja ki a képernyőre
    • ,szám (pl. ,013, vagy ,240 - a , karakter után egyből a szám következik, az egyszerűbb beolvasás miatt mindig 3 karakter szélességűre kiegészítve: 001, 010, 100, stb.) mely az adott cella értékét írja felül a megadott számmal (az "igazi nyelvben" valójában csak a , karakter szerepel, melynél a program megáll és felhasználói inputra vár. A mi esetünkben azonban erre nincs lehetőség, így "improvizáltuk" ezt a megoldást). A megadott szám 0 és 255 közé esik (beleértve a két végpontot is).
    • [ karakter: ha az éppen vizsgált cellánk értéke 0, akkor megkeresi az ezt lezáró ] jelet a kódban és onnan folytatja a kód kiértékelését. Ha a cella értéke nem 0, akkor egyszerűen folytatjuk a kód kiértékelését. Az olvasófej ettől még ugyanennél a cellánál marad.
    • ] karakter: ha az éppen vizsgált cella értéke nem 0 akkor visszaugrik a "nyitó" [ karakterre a kódban. Ha 0, akkor egyszerűen folytatjuk a kód kiértékelését. Az olvasófejet ebben az esetben sem mozgatja.

Input

A bemenet egyetlen sorból áll, mely egy t stringet tartalmaz és a programkódot írja le. A kódban csak a fenti szabályzatban leírt karakterek/karakterkombinációk szerepelhetnek.

Output

A kimenet a kód futtatásának eredménye. A kiírandó számokat egyetlen szóközzel elválasztva jelenítsük meg. Mindegyik szám a 0,...,255 számok valamelyike. Az egyes számokat nem kell három karakter szélességűre kiegészíteni.

Megkötések

  • a szalag hossza 100
  • a programkódban nem szerepel végtelen ciklus
  • a programkód hossza legfeljebb 500 karakter

Példa

2+5 = 7 Input:
  1. ++.>+++++.[<+>-]<.>.
letöltés szöveges állományként Output:
  1. 2 5 7 0
letöltés szöveges állományként
Debreceni Egyetem, Informatikai Kar, v. 2024.09.30.