Questa è la sfida settimanale n. 2. Tema: traduzione
Scrivi un programma o una funzione che accetta il codice sorgente per un programma in Prelude e genera il codice per un programma equivalente in Befunge-93 . Perché il programma sia equivalente, dovrebbe, per ogni dato input, produrre lo stesso output del programma Prelude e arrestarsi se e solo se il programma Prelude si arresta.
Lingua di input: Preludio
Interprete Python:
Un programma Prelude è costituito da un numero di "voci" che eseguono le istruzioni contemporaneamente. Le istruzioni per ciascuna voce sono su una linea separata. Ogni voce ha uno stack separato, che viene inizializzato con una quantità infinita di zero. L'esecuzione inizia nella colonna più a sinistra e avanza di una colonna a destra ogni segno di spunta, tranne quando influenzato da )
o (
istruzioni. Il programma termina quando viene raggiunta l'ultima colonna.
Preludio delle specifiche per questa sfida:
Digits 0-9 Push onto the stack a number from 0 to 9. Only single-digit
numeric literals can be used.
^ Push onto the stack the top value of the stack of the above
voice.
v Push onto the stack the top value of the stack of the below
voice.
# Remove the top value from the stack.
+ Pop the top two integers from the stack and push their sum.
- Pop the top two integers from the stack, subtract the topmost
from the second, and push the result.
( If the top of the stack is 0, jump to the column after the
matching `)` after the current column executes.
) If the top of the stack is not 0, jump to the column after
the matching `(` after the current column executes.
? Read an integer from STDIN.
! Pop one value from the stack and print it to STDOUT as an
integer.
<space> No-op
Appunti
v
e^
agiscono ciclicamente, in modo che lav
voce in basso copi l'elemento stack della voce in alto e^
sulla voce in alto copierà dalla voce in basso. Corollario: entrambiv
e^
duplicare la parte superiore dello stack in un programma a voce singola.- A
(
e la sua corrispondenza)
possono trovarsi su linee diverse. Tuttavia , a)
guarderà sempre la pila della voce in cui è(
stata posizionata la corrispondente , non la pila in cui)
è posizionata la stessa. - I valori prodotti dalle istruzioni
^
ev
funzionano sui valori presenti prima del completamento di qualsiasi altra operazione nella stessa colonna. ?
e!
operare diversamente dalle specifiche trovate su esolangs.org, quindi assicurati di provare con l'interprete leggermente modificato fornito in questo post.
L'ingresso è garantito per avere:
- Parentesi corrispondenti
- Non più di una parentesi in una colonna
- Stesso numero di caratteri su ogni riga
- Almeno una riga
- Nessuna colonna con più di un'istruzione I / O (
!
o?
) - Un carattere di avanzamento riga dopo le istruzioni per ciascuna voce
- Nessun personaggio diverso da quelli sopra menzionati
Lingua di output: Befunge-93
Befunge è un linguaggio basato su stack il cui contatore del programma (PC; un puntatore all'istruzione corrente) si muove liberamente su una griglia bidimensionale. Inizia nell'angolo in alto a sinistra, spostandosi a destra. Il campo di gioco è toroidale, ovvero il movimento del PC avvolge entrambi i bordi. Befunge ha anche uno stack inizializzato su un numero infinito di zero. Befunge ha le seguenti operazioni:
È possibile assumere le seguenti caratteristiche del compilatore / interprete Befunge-93:
- I numeri interi sono di precisione illimitata.
- Permette reti di qualsiasi dimensione.
- Le coordinate della griglia (per
g
ep
) sono basate su 0.
punteggio
Al fine di prevenire invii che producono semplicemente un interprete Prelude in Befunge e codificano il sorgente Prelude in esso, l'obiettivo sarà quello di ridurre al minimo le dimensioni del codice sorgente Befunge risultante.
Di seguito sono forniti alcuni programmi Prelude. Il tuo traduttore verrà eseguito su tutti questi. Il tuo punteggio è la somma delle dimensioni dei programmi Befunge, a condizione che siano tutti validi.
Il tuo traduttore non dovrebbe essere ottimizzato in modo specifico per questi casi di test (ad es. Programmando a mano i programmi Befunge scritti a mano). Se sospetto che ci sia una risposta, mi riservo il diritto di modificare gli input o crearne di nuovi.
Ingressi campione
Stampa n-1
fino a 0
:
?(1-^!)
E logico:
? (0)
?(0 )
1 !
O logico:
? (0)
? (0)
1 1 !
Verificare la parità di input (ovvero modulo 2) di numero non negativo:
?(1-)
^ v
v1-^^-!
Square l'input:
^
^+ !
?(1-)
Stampa il n -esimo numero di Fibonacci, in cui n = 0
corrisponde a 0 e n = 1
corrisponde a 1:
0 v+v!
1 ^
?(1-)
Signum:
1) v # - !
vv (##^v^+)
?(# ^ ##
Divisione per input non negativi:
1 (# 1) v # - 1+)
vv (##^v^+)
? v-(0 # ^ #
?
1+ 1-!
Ovviamente, il tuo programma deve mostrare lo stesso comportamento per tutti i casi, anche se il comportamento del programma di esempio per i numeri negativi non è specificato.
Infine, il tuo traduttore non dovrebbe essere irragionevolmente lungo:
- Deve essere contenuto in un post di Stack Exchange
- Dovrebbe elaborare gli input di esempio in meno di 10 minuti su un tipico computer desktop.
Si noti che un input numerico per Prelude o Befunge viene fornito come segno meno facoltativo seguito da una o più cifre decimali, seguite da una nuova riga. L'altro input è un comportamento indefinito.
Puoi scrivere il tuo traduttore in qualsiasi lingua. Vince il codice Befunge tradotto più breve.
Classifica
- Sp3000 : 16430 byte
1
È all'interno di un loop, quindi potrebbe non essere premuto. Uno 0 può derivare dalla quantità infinita di 0 che iniziano sugli stack.