Befunge est un langage de programmation ésotérique bidimensionnel. L'idée de base est que les commandes (à un caractère) sont placées sur une grille à deux dimensions. Le flux de contrôle parcourt la grille, exécute les commandes qu'il passe et change de direction lorsqu'il frappe une flèche ( >^<v
). Les commandes sont basées sur la pile; voir cette liste . Voir aussi http://esolangs.org/wiki/Befunge .
La spécification pour Befunge-98 est disponible.
Problème
Écrivez un programme qui transforme un programme Befunge en une représentation plus compacte. Par exemple, le programme suivant s'imprime 0
:
> 0 v
> @ .
^ <
Dans ce cas, il pourrait être compacté sans changer le comportement du programme en supprimant des rangées d'espaces, pour donner
>0v
>@.
^ <
Des transformations plus sophistiquées pourraient faire pivoter ou refléter des séquences de commandes et éliminer les commandes de flux de contrôle inutiles afin de compacter le programme. Par exemple, avec ce programme:
>12345v
6
v....7<
.
.
.
@
vous pourriez rentrer la fin du programme dans le trou:
>12345v
>...@ 6
^....7<
Pour le premier exemple, le programme le plus compact possible est
>0.@
Vous pouvez utiliser toutes les transformations tant que le programme de sortie donne le même résultat.
Programmes d'entrée
Les programmes d'entrée sont des programmes Befunge-98 valides.
Vous pouvez supposer que le programme d'entrée est déterministe. Autrement dit, il n'utilise pas de commandes qui lisent l'état externe: les commandes d'entrée utilisateur &
et ~
, le randomiseur ?
et les commandes de code auto-modifiables p
et g
.
Vous pouvez supposer que le programme d'entrée se termine.
Notation
Ce n'est pas un golf de code, mais un problème pour écrire un programme qui exécute le golf de code.
L'entrée est un ensemble de cas de test (programmes Befunge qui satisfont aux restrictions d'entrée ci-dessus). Le score total est la somme des scores des cas de test.
Score pour chaque cas de test
Le score est l'aire de la coque convexe des cellules non vides du programme de sortie, où chaque cellule est traitée comme un carré dont les quatre coins sont des points de réseau dans le plan cartésien. Par exemple, un programme de
> v
@ <
obtient un score de 9,5.
Si votre programme ne se termine pas dans une quantité raisonnable de temps et de mémoire sur une entrée particulière, le score est celui du programme d'entrée. (Cela est dû au fait que vous pourriez ajouter trivialement un wrapper de limitation de temps qui génère le programme d'entrée inchangé si votre programme ne se termine pas à temps.)
Si le programme de test élémentaire a un résultat différent (ou ne se termine pas) après le traitement avec votre programme, le score est le score du programme d'entrée plus une pénalité de 100 points.
.
signifie un entier de sortie, mais si vous commencez en haut à gauche, il n'y a pas d'entier dans la pile à sortir.
.
un entier. Mais aussi, quand il n'y a pas assez de paramètres sur la pile, befunge prétend qu'il y a une quantité suffisante de zéros à la place. Ainsi, le deuxième exemple sortirait 000
.
g
et p
ne sont pas autorisés (désolé, oubliés; modifiés).