Contexte
Fractran est un langage de programmation ésotérique complet de Turing inventé par John Conway. Un programme Fractran consiste en une liste ordonnée de fractions. Le programme commence par prendre un seul entier en entrée. À chaque itération du programme, il recherche dans la liste la première fraction de telle sorte que la multiplication du nombre par cette fraction produit un autre entier. Il répète ensuite ce processus avec le nouveau numéro, en commençant au début de la liste. Lorsqu'il n'y a aucune fraction sur la liste qui peut être multipliée par le nombre, le programme se termine et donne le nombre en sortie.
La raison pour laquelle Fractran est Turing-complete est qu'il simule une machine de registre. La factorisation principale du nombre stocke le contenu des registres, tandis que la division et la multiplication sont un moyen d'ajouter et de soustraire conditionnellement des registres. Je recommanderais de lire l'article Wikipedia (lié à ci-dessus).
Le défi
Votre tâche consiste à écrire le programme le plus court possible qui peut prendre un programme Fractran valide de STDIN comme seule entrée et génère un programme BF valide dans STDOUT qui simule le programme Fractran. Il existe deux façons de simuler un programme Fractran avec BF.
REMARQUE: votre réponse n'est pas un programme BF. Votre réponse est le code qui génère le programme BF à partir de n'importe quel programme Fractran donné. L'objectif est que le programme BF soit l'équivalent du programme Fractran. (techniquement, vous pourriez faire la compétition en BF, mais ce serait difficile)
Option 1
Votre programme doit générer un programme BF qui effectue les opérations suivantes:
- Prend exactement 1 nombre de STDIN sous la forme du caractère ASCII correspondant (en raison de la façon dont fonctionne l'entrée BF), qui est l'entrée du programme Fractran.
- Imprime exactement 1 nombre dans STDOUT sous la forme du caractère ASCII correspondant, qui est la sortie du programme Fractran.
Cette option est destinée à représenter les entrées et sorties exactes d'une machine virtuelle Fractran.
Option 2
Le code BF que votre programme produit doit effectuer les opérations suivantes:
- Prenez l'entrée en ayant la factorisation principale du nombre déjà encodé en mémoire (avant d'exécuter le programme). Si l'entrée est 28 (2 * 2 * 7), alors il y aura une valeur de 2 dans la deuxième cellule et une valeur de 1 dans la septième cellule (le pointeur commence sur la cellule 0). Toutes les autres cellules seront nulles.
- Donnez la sortie en ayant la factorisation principale de la sortie encodée en mémoire lorsque le programme se termine. Si la sortie est 10, alors il doit y avoir une valeur de 1 dans chacune des cellules 2 et 5. Toutes les autres cellules en nombre premier doivent avoir une valeur de zéro. Le contenu des autres cellules n'a pas d'importance.
Cette option représente le modèle informatique derrière le langage Fractran.
Règles et exigences
- L'entrée (en haut de votre programme) sera une liste de fractions sur STDIN. Il y aura une fraction par ligne avec une virgule entre le numérateur et le dénominateur. Une ligne vide représente la fin de l'entrée. Les fractions seront toujours réduites aux termes les plus bas.
- La sortie de votre programme doit être un programme BF valide sur une seule ligne vers STDOUT. Ce programme devrait être capable de simuler ce programme Fractran particulier selon l'une des deux options. Pour toute entrée, le programme BF généré doit pouvoir produire la même sortie que le programme Fractran.
- Vous devez indiquer quelle option vous avez choisie.
- Vous pouvez choisir les limites de la mémoire et de la bande BF et indiquer si elles sont
- CODE GOLF. En outre, la taille des programmes BF générés n'a pas d'importance, seule la taille du programme qui effectue la conversion.
- Les programmes ne doivent être composés que d'ASCII imprimables
Si je suis ambigu quelque part, n'hésitez pas à demander. C'est un défi très compliqué à décrire.
De plus, veuillez publier le code BF généré par votre programme pour l'entrée suivante, afin de fournir un moyen facile de vérifier si votre programme fonctionne:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Ce programme calcule le nombre de 1 dans l'expansion binaire d'un nombre. Cependant, l'entrée et la sortie sont formatées étrangement (comme avec tous les programmes Fractran). L'entrée est de la forme 2 ^ A, tandis que la sortie est de la forme 13 ^ B.
la source
Réponses:
Python, 182 caractères
Option 1, cellules d'octets standard. Il n'y a que 255 entrées possibles (0 en tant qu'entrée n'a pas vraiment de sens), donc je lance juste un interprète Fractran 255 fois en Python et génère un programme Brainfuck de recherche de table simple encodant les résultats.
Sortie pour l'exemple d'entrée (
___
= 246 conditions imbriquées supplémentaires, je ne peux pas coller le résultat entier car il est trop grand):la source
Python, 420 caractères
Cela utilise une sorte de mélange des options 1 et 2: Cela suppose que brainfuck est implémenté avec de grands entiers (j'utilise une implémentation Sage). Saisissez un programme fractran, par exemple
33/20,5/11,13/10,1/5,2/3,10/7,7/2
. Ensuite, préchargez un nombre, par exemple2^5
, au niveau du curseur. Ensuite, exécutez la sortie de ce script python. Attendez 44 secondes. Le résultat se13^2
trouve là où le curseur a commencé. Je n'ai pas attendu la réponse2^7
.Ceci est mon premier script brainfuck. Il peut certainement être joué plus loin, mais j'ai d'autres choses à faire jusqu'à plus tard ce soir.
edit: plutôt que de jouer plus loin, je travaille sur une solution pour l'option 2. aussi, voici la sortie pour le programme demandé:
la source
2^7
avec mon interprète Brainfuck en moins de 5 secondes. De plus, ne devrait-il pas êtreraw_input()
au lieu deraw_input
(ou s'agit-il d'une bizarrerie que je ne connais pas)?raw_input()
c'est nécessaire. Je ne suis pas surpris que des interprètes brainfuck compétents fassent mieux que ma terrible implémentation naïve de Sage.Perl, 326 caractères
Je vais répondre à ma propre question, espérons-le, pour stimuler davantage de réponses. Je ne suis bien sûr pas admissible à gagner. Il s'agit de l'option 2 avec une mémoire et des cellules illimitées, bien que cela fonctionne sur le wrapping de cellules. Chaque fraction est convertie en un seul bloc de code. Les nouvelles lignes sont pour la lisibilité.
Voici l'exemple de sortie. Cela profite du fait que les autres caractères sont ignorés en tant que commentaires. Cela semble également être une sortie très courte par rapport aux autres entrées, bien que la taille de la sortie n'ait pas d'importance technique.
la source
Sauge, 431 caractères
Il s'agit d'une toute nouvelle solution. J'ai trouvé de meilleures façons de faire les choses dans brainfuck, et cela implémente correctement l'option 2. Ajout de nouvelles lignes pour plus de clarté. Cela peut probablement être approfondi, mais cela implique de réécrire le BF pour avoir une profondeur de boucle inférieure.
Exemple de sortie:
Compte tenu de l'entrée
33/20,5/11,13/10,1/5,2/3,10/7,7/2
la source