Questa sfida è stata pubblicata come parte della sfida LotM di aprile 2018
Brain-Flak è un linguaggio turing-tarpit che ha guadagnato molta fama qui su PPCG. La memoria del linguaggio è composta da due pile, ma un terzo "nascosto" è stato scoperto da Wh e at Wizard , portando ad alcuni nuovi modi interessanti di pensare ai programmi Brain-Flak.
Quindi, che ne dite di dare maggiore visibilità a quel povero terzo stack nascosto? Creiamo una lingua in cui il terzo stack ha il riconoscimento che merita! Qui ti presento Third-Flak .
La lingua
In Third-Flak c'è solo uno stack, chiamato terzo stack. Gli operatori dei lavori alla terza pila nello stesso modo che fanno in Brain-Flak, ma qui non ci sono []
, {}
, <>
nilads e non {...}
monade (in modo che i caratteri solo ammissibili in un programma di terze Flak sono ()[]<>
). Ecco cosa fa ogni operatore (verranno forniti esempi che rappresentano il terzo stack con un elenco in cui l'ultimo elemento è in cima allo stack):
()
è l'unico operatore a due caratteri in Third-Flak. Aumenta la parte superiore del terzo stack di 1. Esempio:[1,2,3]
→[1,2,4]
(
,[
,<
: Tutte le parentesi di apertura che non sono coperti dal caso precedente spingono una0
alla terza pila. Esempio:[1,2,3]
→[1,2,3,0]
)
estrae due elementi dal terzo stack e rimanda indietro la loro somma. Esempio:[1,2,3]
→[1,5]
]
estrae due elementi dal terzo stack e respinge il risultato della sottrazione del primo dal secondo. Esempio:[1,2,3]
→[1,-1]
>
apre un elemento dal terzo stack. Esempio[1,2,3]
→[1,2]
Ed ecco le altre regole della lingua:
All'inizio dell'esecuzione il terzo stack contiene solo un singolo 0.
È vietato avere un programma vuoto
[]
o<>
all'interno di un programma (sarebbero comunque noops se seguissero la semantica di Third-Flak, ma in realtà hanno un significato diverso in Brain-Flak che non è possibile ricreare qui).Le parentesi devono sempre essere bilanciate, tranne per il fatto che possono mancare parentesi finali finali alla fine del programma. Ad esempio,
[()<(()
è un programma Third-Flak valido (e il terzo stack alla fine del programma sarebbe[1,0,1]
).Un programma può contenere solo i sei caratteri consentiti
()[]<>
. I programmi sono garantiti come non vuoti.
Nota: è implicito dalle regole precedenti che non dovrete affrontare situazioni in cui è necessario pop da uno stack vuoto.
La sfida
Semplice, scrivi un interprete per Third-Flak. Il programma deve prendere come input un programma di terzo flak e restituire come output lo stato del terzo stack alla fine del programma.
Il formato di output è flessibile fintanto che è possibile leggere in modo inequivocabile da esso lo stato del terzo stack e lo stesso numero viene sempre codificato allo stesso modo (Questo è solo un modo per dire che qualsiasi formato di output che non è un modo palese cercare di imbrogliare va bene).
La scelta dell'output può limitare l'intervallo di numeri che è possibile gestire purché ciò non banalizzi la sfida (poiché si tratterebbe di una scappatoia predefinita ).
Casi test
Per ciascun caso di test la prima riga è l'input e la seconda riga lo stack di output rappresentato come un elenco di numeri separato da spazi in cui la parte superiore dello stack è l'ultimo elemento.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
e
è qui .
[()]
infrange la regola secondo cui non dobbiamo preoccuparci di saltar fuori da una pila vuota