Befunge è un linguaggio di programmazione esoterico bidimensionale. L'idea di base è che i comandi (a un carattere) siano posizionati su una griglia bidimensionale. Il flusso di controllo attraversa la griglia, eseguendo i comandi su cui passa e cambiando direzione quando colpisce una freccia ( >^<v
). I comandi sono basati su stack; vedi questo elenco . Vedi anche http://esolangs.org/wiki/Befunge .
Sono disponibili le specifiche per Befunge-98 .
Problema
Scrivi un programma che trasforma un programma Befunge in una rappresentazione più compatta. Ad esempio, viene stampato il seguente programma 0
:
> 0 v
> @ .
^ <
In questo caso, potrebbe essere compattato senza cambiare il comportamento del programma rimuovendo file di spazi, per dare
>0v
>@.
^ <
Trasformazioni più sofisticate potrebbero ruotare o rispecchiare sequenze di comandi ed eliminare comandi di flusso di controllo non necessari al fine di compattare il programma. Ad esempio, con questo programma:
>12345v
6
v....7<
.
.
.
@
potresti infilare la fine del programma nel buco:
>12345v
>...@ 6
^....7<
Per il primo esempio, il programma più compatto possibile è
>0.@
È possibile utilizzare qualsiasi trasformazione purché il programma di output fornisca lo stesso risultato.
Programmi di input
I programmi di input sono programmi Befunge-98 validi.
Si può presumere che il programma di input sia deterministico. Cioè, non usa i comandi che leggono lo stato esterno: i comandi di input dell'utente &
e ~
, il randomizer ?
, i comandi di codice auto-modificanti p
e g
.
Si può presumere che il programma di input sia terminato.
punteggio
Non si tratta di un codice golf, ma di un problema di scrittura di un programma che esegue il codice golf.
L'input è un insieme di casi di test (programmi Befunge che soddisfano le restrizioni di input sopra). Il punteggio totale è la somma dei punteggi per i casi di test.
Punteggio per ogni caso di test
Il punteggio è l'area dello scafo convesso delle celle non vuote nel programma di output, in cui ogni cella viene trattata come un quadrato i cui quattro angoli sono punti reticolari nel piano cartesiano. Ad esempio, un programma di
> v
@ <
ottiene un punteggio di 9.5.
Se il programma non termina in un periodo di tempo e memoria ragionevole su un determinato input, il punteggio è quello del programma di input. (Questo perché è possibile aggiungere banalmente un wrapper a tempo limitato che restituisce invariato il programma di input se il programma non termina in tempo.)
Se il programma del test case ha un risultato diverso (o non riesce a terminare) dopo l'elaborazione con il tuo programma, il punteggio è il punteggio del programma di input più una penalità di 100 punti.
.
significa numero intero di output, ma se si parte in alto a sinistra, allora non c'è numero intero nello stack di output.
.
genera un numero intero. Inoltre, quando non ci sono abbastanza parametri nello stack, befunge finge invece che vi sia una quantità sufficiente di zero. Quindi il secondo esempio verrebbe prodotto 000
.
g
e p
non sono ammessi (scusate, ho dimenticato quelli; modificato).