In questa sfida, si scriverà un interprete per 2 Ω (trascritto come TwoMega ), un linguaggio basato vagamente su Brainfuck con uno spazio di archiviazione infinito-dimensionale.
La lingua
2 Ω contiene tre parti di stato:
Il nastro , che è un elenco infinito di bit, tutti inizializzati su 0. Ha un elemento all'estrema sinistra, ma nessun elemento all'estrema destra.
Il puntatore di memoria , che è un numero intero non negativo che è un indice di un elemento nel nastro. Un puntatore di memoria superiore si riferisce a una cella a nastro più a destra; un puntatore di memoria pari a 0 fa riferimento all'elemento più a sinistra. Il puntatore di memoria è inizializzato su 0.
L' ipercubo , che è una "scatola" di celle concettualmente ∞- dimensionale, ognuna delle quali contiene un bit inizializzato su 0. La larghezza dell'ipercubo è legata in ogni dimensione a solo 2 celle, ma l'infinito delle dimensioni indica il numero di le cellule non sono numerabili .
Un indice nell'ipercubo è un elenco infinito di bit che fa riferimento a una cella nell'ipercubo (allo stesso modo in cui un elenco finito di bit potrebbe essere utilizzato per fare riferimento a un ipercubo di dimensione finita). Poiché il nastro è un elenco infinito di bit, l'intero nastro fa sempre riferimento a un elemento di Hypercube; questo elemento è chiamato referente .
2 Ω dà significato a 7 caratteri diversi:
<
decrementa il puntatore della memoria di 1. Decrementarlo al di sotto di 0 è un comportamento indefinito, quindi non è necessario gestirlo.>
incrementa il puntatore della memoria di 1.!
lancia il bit al referente..
emette il bit al referente.^
sostituisce il bit nella cella a cui punta il puntatore di memoria sul nastro con l' inverso del bit sul referente.[x]
esegue il codicex
purché il bit al referente sia 1.
La sfida
Il tuo compito è scrivere un programma che accetta una stringa come input ed esegue quell'input come un programma 2 Ω .
Questo è code-golf , quindi vince la risposta valida più breve (misurata in byte).
Appunti
- Puoi presumere che il programma sarà composto esclusivamente da caratteri
<>!.^[]
e che[]
sarà nidificato correttamente. - L'interprete dovrebbe essere limitato solo dalla memoria disponibile sul sistema. Dovrebbe essere in grado di eseguire i programmi di esempio in un ragionevole lasso di tempo.
Programmi di esempio
Stampa 1:
!.
Stampa 010:
.!.!.
Stampa 0 per sempre:
![!.!]
Stampa 0 per sempre o 1 per sempre se !
è anteposto:
[.]![!.!]
cat
programma: non sembra esserci un'istruzione per ricevere input.
.
- stampa un singolo zero e poi esiste; !^!.
- ne stampa una sola, quindi esce. Più sarebbe buono però. Al momento è necessario comprendere i contributi per verificarli (e quindi migliorarli!)
[0,0,0,0,0,0,0...]
(cioè la presenza di !
a all'inizio del programma).
[.]![!.!]
per stampare il valore di quella cella per sempre
1
s sul nastro è sempre finito. In effetti, esiste una biiezione abbastanza semplice tra i numeri naturali e gli stati del nastro (interpretare il contenuto del nastro come un numero binario all'indietro), il che dimostra che Hypercube è fondamentalmente un array 1D infinito, a cui si accede lanciando i bit in un valore di puntatore intero , invece di in / decrementare come in brainfuck.