Ecrivez le programme le plus court dans votre langue préférée pour interpréter un programme brainfuck . Le programme est lu depuis un fichier. L'entrée et la sortie sont l'entrée standard et la sortie standard.
- Taille de la cellule: 8bit non signé. Le débordement n'est pas défini.
- Taille du tableau: 30000 octets (non encerclé)
- Les mauvaises commandes ne font pas partie de l'entrée
Les commentaires commencent par # et s'étendent jusqu'à la fin de la ligne. Lescommentaires sont tout ce qui n'est pas dans+-.,[]<>
- aucun symbole EOF
Un très bon test peut être trouvé ici . Il lit un nombre puis imprime les nombres premiers jusqu’à ce nombre. Pour empêcher la pourriture de lien, voici une copie du code:
compute prime numbers
to use type the max number then push Alt 1 0
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
===================================================================
======================== INPUT NUMBER ============================
===================================================================
+ cont=1
[
- cont=0
>,
======SUB10======
----------
[ not 10
<+> cont=1
=====SUB38======
----------
----------
----------
--------
>
=====MUL10=======
[>+>+<<-]>>[<<+>>-]< dup
>>>+++++++++
[
<<<
[>+>+<<-]>>[<<+>>-]< dup
[<<+>>-]
>>-
]
<<<[-]<
======RMOVE1======
<
[>+<-]
]
<
]
>>[<<+>>-]<<
===================================================================
======================= PROCESS NUMBER ===========================
===================================================================
==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====
>+<-
[
>+
======DUP======
[>+>+<<-]>>[<<+>>-]<
>+<--
>>>>>>>>+<<<<<<<< isprime=1
[
>+
<-
=====DUP3=====
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
=====DUP2=====
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
>>>
====DIVIDES=======
[>+>+<<-]>>[<<+>>-]< DUP i=div
<<
[
>>>>>+ bool=1
<<<
[>+>+<<-]>>[<<+>>-]< DUP
[>>[-]<<-] IF i THEN bool=0
>>
[ IF i=0
<<<<
[>+>+<<-]>>[<<+>>-]< i=div
>>>
- bool=0
]
<<<
- DEC i
<<
-
]
+>>[<<[-]>>-]<<
>[-]< CLR div
=====END DIVIDES====
[>>>>>>[-]<<<<<<-] if divides then isprime=0
<<
>>[-]>[-]<<<
]
>>>>>>>>
[
-
<<<<<<<[-]<<
[>>+>+<<<-]>>>[<<<+>>>-]<<<
>>
===================================================================
======================== OUTPUT NUMBER ===========================
===================================================================
[>+<-]>
[
======DUP======
[>+>+<<-]>>[<<+>>-]<
======MOD10====
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>-] if ten=0 ten=10
<<- dec ten
<- dec num
]
+++++++++ num=9
>[<->-]< dec num by ten
=======RROT======
[>+<-]
< [>+<-]
< [>+<-]
>>>[<<<+>>>-]
<
=======DIV10========
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
<<- dec ten
<- dec num
]
>>>>[<<<<+>>>>-]<<<< copy div to num
>[-]< clear ten
=======INC1=========
<+>
]
<
[
=======MOVER=========
[>+<-]
=======ADD48========
+++++++[<+++++++>-]<->
=======PUTC=======
<.[-]>
======MOVEL2========
>[<<+>>-]<
<-
]
>++++[<++++++++>-]<.[-]
===================================================================
=========================== END FOR ===============================
===================================================================
>>>>>>>
]
<<<<<<<<
>[-]<
[-]
<<-
]
======LF========
++++++++++.[-]
@
Exemple d'exécution:
$ python2 bf.py PRIME.BF
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
code-golf
interpreter
brainfuck
Alexandru
la source
la source
,
d’EOF? Ou que c'est à nous de choisir une valeur lorsque vous essayez,
EOF? Ou bien le comportement non défini EOF est-il tout à fait?Réponses:
Perl, 120
138Cela fonctionne parfaitement: bonjour.bf et primes.bf:
Initialisation: l’opcode vers la table de traduction Perl est stocké dans
%c
. La forme lisible ressemble à ceci:Étape 1: Slurp entrée du programme à
$_
et le transformer en code Perl en utilisant la table de traduction. Les commentaires sont automatiquement supprimés (remplacés parundef
) à cette étape.Étape 2: décompressez toutes les
$b[$p]
occurrencesÉtape 3: Lancez le programme en utilisant
eval
.la source
qw
syntaxe de Perl pour définir%c
directement - bon pour 7 caractères en moins (vous devrez le direprint+chr$b[$p]
etord(getc)
, bien que)Python (aucune évaluation), 317 octets
la source
f(u,c,k)
while b*c[c[0]]and j<1
parwhile b*c[c[0]]*(j<1)
Code machine 16 bits 8086: 168 octets
Voici la version encodée en base64 , convertissez-la et enregistrez-la sous «bf.com» et exécutez-la à partir de l'invite de commande Windows: «bf progname»
MODIFIER
Voici un assembleur (style A86) pour créer l'exécutable (j'ai dû faire de l'ingénierie inverse, car j'avais égaré la source originale!)
la source
brainfuck ,
843691 octetsEdit: a décidé de revenir sur cette question et a trouvé un nombre surprenant de façons de jouer au golf hors octets
Ceci prend une entrée sous la forme
code!input
où le!input
est optionnel. Il simule également les cellules négatives sans utiliser de cellules négatives et peut stocker jusqu’à des(30000-(length of code+6))/2
cellules.Essayez-le en ligne!
la source
Ruby 1.8.7,
188185149147 caractèresVersion assez lisible:
Comme vous le voyez, je vous ai volé sans vergogne votre idée de traduire en langage hôte puis d’utiliser eval pour l’exécuter.
la source
>0
plutôt que de tester l' égalité:!=0
. Les spécifications disent non signé, et le débordement n'est pas défini.3e4
travaillera également par opposition à30000
File.read($*.pop).bytes
->$<.bytes
devrait aussi marcher{?a,"foo"}
ce qui équivaut à{?a=>"foo"}
. Et le test ici montre que vous pouvez réellement remplacerFile.read($*.pop).bytes
avec$<
sans aucun problème. De même, tout aligner sur quelque chose commeeval"a[0]..."+$<.bytes.map{?.,"putc a[i]",...}*";"
raccourcit la solution de quelques caractères supplémentaires .Lambda Calcul binaire 112
Le programme affiché dans le vidage hexadécimal ci-dessous
s'attend à ce que son entrée se compose d'un programme Brainfuck (en regardant uniquement les bits 0,1,4 pour distinguer entre, -. + <>] [) suivi d'un], suivi de l'entrée pour le programme Brainfuck.
Enregistrez le vidage hexadécimal ci-dessus avec xxd -r> bf.Blc
Récupérez un interpréteur blc à l’ adresse https://tromp.github.io/cl/cl.html
Bonjour le monde!
la source
Retina 0.8.2 ,
386391386 octetsLe code contient des caractères NUL (
0x00
) non imprimables . Ce n'est pas encore super golfé, parce que c'est déjà très lent, et si je joue plus, je ne sais pas combien de temps cela prendra pour finir. Apparaît pour expirer sur l'échantillon de recherche principale.Il peut y avoir des bogues dans l'interprète en ligne ou dans mon programme (les nouvelles lignes principales n'apparaissent pas dans le résultat?).
Prend les entrées comme
<code>│<input>
. Non, ce n'est pas un tuyau (|
). C'est le caractère UnicodeU+2502
. Le code utilise également les caractères Unicodeÿ▶◀├║
. Les caractères Unicode sont utilisés pour permettre la saisie de tous les caractères ASCII. Par conséquent, ces caractères doivent être séparés du code par un caractère non-ASCII.Essayez-le en ligne
Notez qu'il y a une fin de ligne à cet endroit.
Brève explication:
Les zéros
0x00
sont utilisés pour la bande, qui est infinie. Le premier remplacement configure l'interprète sous la forme▶<code>│<input>├<output>║▶<tape>
, le premier▶
étant le pointeur du code et le second le pointeur de la bande.ÿ
is0xFF
(255), qui est utilisé pour la translittération (utilisée pour implémenter+
et-
) pour ramener les cellules à zéro.◀
est uniquement utilisé pour la lisibilité (dans le cas où le programme est arrêté au milieu ou si vous voulez voir le programme en cours d'exécution). Sinon, vous ne pourriez pas dire de quelle manière le pointeur se déplaçait.Code commenté:
Cliquez ici pour le code avec des zéros à la place des octets nuls. Les occurrences de
$0
ne doivent pas être remplacées par des valeurs nulles.Edit : supporte maintenant les entrées vides et supprime les retours à la ligne.
La sortie infinie est maintenant prise en charge. (403 octets)
la source
<code>
et l'un à<tape>
côté de l'autre (bien que ce soit plus de caractères) pour que la transition vers un interprète SMBF soit plus facile, si jamais je décidais de le faire.TI-BASIC, 264 octets
En raison des limitations de TI-BASIC, cette action n’est pas prise en compte car elle enfreint la règle 2; la RAM des calculatrices est très limitée, et faire quelque chose comme
30000->dim(L1
(j'utilise L1 pour la pile / matrice) va la forcer à lancer unERR:MEMORY
. En tant que tel, la pile / le tableau commence à une taille de 1 et augmente si le pointeur pointe vers un élément situé au-delà de sa fin. Il enfreint également la règle 3, car il enfreint déjà la règle 2, de sorte que je pourrais également ne pas m'embêter avec une limite de taille de cellule.En passant, je pourrais probablement continuer à jouer au golf ... J'ai apporté une ou deux modifications à cette fin depuis la première soumission, mais si la version ci-dessous ne fonctionne pas, retournez à la modification du 6 mai 2015 et utilisez-la code à la place. De plus, comme TI-BASIC ne contient pas vraiment d’ASCII, il faut entrer des nombres de toute taille (et tout ce qui retourne un nombre, comme une variable ou une expression), puis les afficher à leur tour.
Utilisez SourceCoder pour l'intégrer dans un fichier .8xp, puis envoyez-le à votre calculatrice avec TI-Connect ou TILP ou quelque chose du genre, et exécutez-le en incluant votre programme brainfuck entre guillemets, suivis de deux points et de ce que vous avez appelé le programme TI-BASIC. Par exemple, si vous l' avez nommé Brainf, vous auriez exécuter un programme comme celui - ci:
"brainfuck goes here":prgmBRAINF
. Si vous avez un shell sur votre calc qui intercepte les autres commandes quand il détecte leprgm
jeton, bien, faites ceci:"brainfuck goes here" -> press ENTER -> prgmBRAINF
.Si vous n'avez pas le moyen de connecter votre calculatrice à votre ordinateur et que vous voulez taper ceci sur-calc à la place (je ne vois pas pourquoi vous voudriez, mais je m'écarte du sujet), notez que
->
leSTO>
bouton au-dessus de ON est affiché. key,~
est le symbole négatif à côté de ENTER, et pour remplacer toutes les instances deL<number>
avec le jeton de liste correspondant trouvé sur2ND -> <number on keypad>
Merci à thomas-kwa (du moins, je pense que c'est son nom d'utilisateur Stack) pour m'aider à optimiser cela, en particulier avec les instructions
[
et]
.la source
Ans+S
?S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S
. (a-a=0
) Et hé, ne vous inquiétez pas d'oublier UN SEUL ordre d'ordre d'opération ici, j'ai vu toute une foule de gens oublier l'ordre d'opération pour%
(mod) sur un défi.Python
275248255J'ai décidé de lui laisser une chance.
la source
exec t
?). Si vous utilisez le conseil de S.Mark et créez également lefor
cycle complet en une seule ligne, vous pouvez le réduire à 243 caractères.[]
un programme bf valide bien que trivial. J'ai suggéré une modification qui corrige cela, mais augmente le nombre de caractères. Pour réduire davantage le nombre de caractères, vous pouvezfrom sys import *
et utiliser à la'i+=1,...'.split(',')
place de['i+=1',...]
.+1
, mais de nombreuses améliorations ont été suggérées et non mises en œuvre.Haskell,
457413 caractèresCe code "compile" le programme BF en une
IO
action de la forme suivante:State -> IO State
l'état est une fermeture à glissière sur une chaîne infinie.Triste d'avoir dû dépenser 29 caractères pour désactiver la mise en mémoire tampon. Sans cela, cela fonctionne, mais vous ne voyez pas les invites avant de devoir saisir une entrée. Le compilateur lui-même (
b
,f
etk
) ne comporte que 99 caractères, le temps d'exécution (#
et%
) 216. Le pilote a l'état initial de 32 autres.Mise à jour du 15/02/2011: Suggestions de JB Incorporated, modification du nom et renforcement du nom
main
la source
IO
, et les arguments de justSystem
(-19). Le problème de mise en mémoire tampon me préoccupe également, car la spécification ne le mentionne pas vraiment et la réponse la plus votée ne fait même pas d'E / S. Si vous devez le conserver, il est probablement plus courthFlush
après chaque écriture que de changer le mode de mise en mémoire tampon global (-34 + 15).Convoyeur, 953
C'est peut-être le plus beau code que vous verrez jamais:
la source
C
284362 (à partir d'un fichier)Primes:
Compilé et exécuté avec succès VS2008
La solution d'origine n'a pas réussi à reconnaître les boucles initialement définies à zéro. Encore de la place pour jouer au golf. Mais finalement, résout le programme Prime Number.
Ungolfed:
Tests:
Bonjour le monde
Rot13
la source
l
) à chaque boucle? Je pense que vous êtes censé vérifier l'emplacement actuel de la tête (p
).l
dans la mémoire tampon a atteint zéro et casse sinon il réinitialise le flux à la boucle d'origine[
. Ceci est nécessaire pour les[
boucles imbriquées .break;else
parreturn;
.(c==62)?a:b
par(c-62)?b:a
.PHP 5.4,
296294273263261209191183178166 caractères:Je lui ai donné un coup de feu sans utiliser eval, mais j'ai finalement dû l'utiliser
Toutes les commandes fonctionnent. Cela abuse fortement des variables variables et génère des avertissements. Cependant, si l'on modifie leur php.ini en avertissements de blocage (ou en stderr vers / dev / null), cela fonctionnera très bien.
Vérification (c'est l'exemple "Hello World!" De Wikipedia ): http://codepad.viper-7.com/O9lYjl
Ungolfed,
367365335296267 caractères:Cela devrait être exécuté via la ligne de commande:
php bf.php hello.bf
la source
Windows PowerShell, 204
Conversion assez simple des instructions, puis
Invoke-Expression
.Histoire:
3e4
est plus court que30000
.switch
.Write-Host
.la source
C, 333 caractères
Ceci est mon premier interprète BF et le premier golf que j'ai réellement dû déboguer.
Ceci exécute le générateur de nombres premiers sur Mac OS X / GCC, mais un supplément
#include<string.h>
peut être nécessaire pour un coût de 19 caractères supplémentaires si la définition implicite destrchr
ne fonctionne pas sur une autre plate-forme. En outre, cela supposeO_RDONLY == 0
. En dehors de cela, laisser deint
côté la déclaration deM
sauvegarde sauve 3 caractères mais cela ne semble pas être conforme à C99. Même avec le troisième*
dansb()
.Cela dépend des particularités du codage ASCII. Les opérateurs Brainfuck sont tous des paires complémentaires séparées par une distance de 2 dans l'espace de code ASCII. Chaque fonction de ce programme implémente une paire d'opérateurs.
la source
#define
table à la place de la table de fonctions serait probablement aussi un testeur. J'aime juste le nombre 333 et le tableau: v).||
.CJam, 75 octets
Essayez-le en ligne: inverseur de chaîne , Hello World .
Explication
Prend le code sur la première ligne de STDIN et l'insère sur toutes les lignes en dessous.
Qu'en est-il de cette liste magique?
La liste résultante est la suivante:
Nous générons les extraits pour
+
et>
de ceux pour-
et<
, simplement en remplaçant les parenthèses de gauche («décrémentation» de CJam) par des parenthèses droites («incrémentation» de CJam).la source
F #: 489 caractères
Le programme suivant ne saute pas aux instructions '[' / ']', mais scanne le code source pour le prochain jeton correspondant. Bien sûr, cela le ralentit un peu, mais il peut toujours trouver les nombres premiers inférieurs à 100. Les types entiers F # ne débordent pas, mais sont bouclés.
Voici la version courte:
Un méchant piège était que le programme primes.bf s'étouffait avec les nouvelles lignes de Windows. Afin de l'exécuter, je devais enregistrer le numéro d'entrée dans un document texte au format UNIX et l'envoyer au programme avec un tuyau:
Edit: entrer Alt + 010 suivi de Enter fonctionne également dans Windows cmd.exe
Voici la version la plus longue:
la source
Delphi,
397382378371366364328 caractèresMange ce Delphi!
Voici le même code, mis en retrait et commenté:
Celui-ci m'a pris quelques heures, car ce n'est pas le genre de code que j'écris normalement, mais profitez-en!
Remarque: le test principal fonctionne, mais ne s'arrête pas à 100, car il indique # 13 (CR) avant # 10 (LF) ... est-ce que d'autres soumissions souffrent également de ce problème lorsqu'elles sont exécutées sur des systèmes d'exploitation CRLF?
la source
C, 260 + 23 = 283 octets
J'ai créé un programme C qui peut être trouvé ici .
Il doit être compilé via
gcc -D"q(a,b)"="*c-a||(b);" -o pmmbf pmmbf.c
et peut être appelé comme suit:pmmbf ",[.-]" 30000
le premier argument (entre guillemets) contenant le programme bf à exécuter, le deuxième déterminant la taille de la bande.la source
-D"q(a,b)"="*c-a||(b);"
option, car cela semble (pour ma compréhension limitée, au moins) vous aider à réduire votre code.define
trop longs et les nouvelles lignes, mais je ne pense pas que ce soit vraiment casher. Quoi qu'il en soit, avec les citations, commentez, etgcc -D
je ne vois pas l'avantage du tout.C, 267
Exécuter en tant que ./a.out primes.bf
Version non-golfée:
la source
Python 2, 223
J'avoue avoir recyclé un de mes anciens programmes (mais j'ai dû le modifier un peu, car l'ancienne version n'avait pas d'entrée, mais une vérification d'erreur ...).
Lance bien la calculatrice de nombres premiers.
Je vois maintenant qu'Alexandru a une réponse qui présente certaines similitudes. Je posterai tout de même ma réponse car je pense qu’elle contient de nouvelles idées.
la source
C (gcc) Linux x86_64,
884 621 525 487 439 383 358354 octetsEssayez-le en ligne!
Il s'agit d'un JIT qui compile le code BF en langage machine x86_64 au moment de l'exécution. Ceci effectue une traduction directe si souvent des séquences se produisant telles que
>>>
,<<<
,+++
et---
ne sont pas fusionnés en des instructions plus rapides.Version moins golfée:
la source
C,
374368Lit à partir d'un fichier. Passe le test PRIME.BF.
Utilisation: ./a.out PRIME.BF
Reformaté:
la source
Lua, 285
Version assez lisible:
Fonctionne parfaitement
Lua, 478, sans corde de charge
Version lisible:
la source
Brainfuck, 948 octets
Eh bien, cela a pris un certain temps. J'ai joué au golf avec un auto-interprète Brainfuck en… pas moi.
la source
Rappel , 594 octets
En bref: Recall n’a pas d’opérateurs arithmétiques au sens classique, il n’a que des opérations au niveau des bits. Vous ne pouvez pas simplement "ajouter un", etc. Rappel est également strictement basée sur la pile.
Exemple 1: imprimer quelque chose
Contribution:
Sortie:
Exemple 2: indiquez 100 nombres carrés en sortie
Contribution:
Sortie:
Cet exemple peut prendre quelques minutes pour s'exécuter et provoquer un message "cet onglet est gelé". Ignorez ça et attendez.
la source
OCaml (lex), 497 caractères
OCamllex fait partie de la distribution standard d’OCaml.
Enregistrer sous b.mll et exécuter avec
Je n'aime pas analyser manuellement, alors j'ai utilisé le générateur de lexer fourni. À partir des jetons lus, nous composons une fonction pour tout le programme brainf * ck.
la source
C # (2861 caractères, ~ 84 lignes)
Ce n'est pas la plus jolie solution au problème, et probablement pas tout ce que «Golf-ish», puisque je n'étais pas aussi préoccupé par la longueur que j'aurais probablement dû l'être. (Je n'ai pas supprimé les commentaires ni les espaces.) Je voulais juste essayer quelque chose dans une nouvelle langue, pour voir si je pouvais. Si je le faisais à nouveau, j'abandonnerais l'utilisation de la pile pour revenir de ']' et regarderais en arrière. Exécutée sans arguments de ligne de commande, elle exécute le programme hello world donné dans la description du problème. Il accepte un argument de ligne de commande, le nom du fichier du programme à exécuter.
Edit: Suppression des références inutilisées.
la source
C (gcc) ,
273268 octetsEssayez-le en ligne!
-5 grâce à ceilingcat
Prend la contribution de stdin.
Cela dépend un peu de l'environnement, mais est assez cohérent. C’est effectivement la solution eval pour c. Il écrit un programme C approprié dans le fichier wc, le compile et l'exécute comme l'exécutable souhaité. Ainsi, en tant qu'effet bonus, le code bf est compilé et laissé
a.out
comme binaire. Notez que selon le système, vous devrez peut-être modifier la dernière chaîne. En particulier, la plupart des compilateurs Windows c appellent l'exécutable par défaut "a.exe". Heureusement, autant que je sache, ils ont tous la même longueur, donc le décompte est identique. (Cependant, si vous n'avez pas défini de cc, vous devrez peut-être ajouter une lettre telle que gcc à la commande de compilation en ajoutant 1 octet).Je suis conscient que ce fil est un peu vieux, mais je n'ai pas encore vu ce style de solution C, alors j'ai pensé l'ajouter.
la source
[MODIFIER]
C ++ 11, 355, lit à partir du fichier:
Tester
http://ideone.com/b7vO4
[ANCIENNE VERSION]
C ++ 11, 391, à voir en cours d'exécution: http://ideone.com/yZHVv
la source