Défi
Écrivez un programme ou une fonction qui a donné une chaîne, renvoie un programme Brainfuck valide qui, une fois compilé et exécuté en tant que Brainfuck, renvoie cette chaîne.
Supposons que toutes les entrées sont codées en ASCII.
Supposons que le programme BF en sortie s'exécute dans un environnement avec une bande infinie.
Supposons que le pointeur commence à la cellule 0 avec chaque cellule initialisée à une valeur de zéro.
Chaque exemple ci-dessous représente une sortie correcte possible pour l'entrée donnée. En particulier, les exemples incluent des sauts de ligne et des espaces supplémentaires pour aider la lisibilité humaine. Les solutions sont libres de formater le code BF en sortie de n'importe quelle manière.
La bande est doublement infinie.
Toutes les cellules fournies par l'interpréteur sont exactement des cellules 8 bits. Le débordement et le débordement s'enroulent dans une matière prévisible et saine.
Exemples
Chaîne d'espace
Compte tenu de l'entrée , votre programme / fonction pourrait retourner:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Point d'exclamation
Compte tenu de l'entrée !
, votre programme / fonction pourrait retourner:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Deux lettres
Compte tenu de l'entrée hi
, votre programme / fonction pourrait retourner:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Il s'agit de code-golf , donc le code avec le plus petit nombre d'octets l'emporte. Bonne chance.
Réponses:
Gelée , 8 octets
Essayez-le en ligne!
Exemple d'exécution
Pour la saisie
hi
, ce programme imprime(sans les sauts de ligne) qui, à son tour, imprime
hi
.Comment ça fonctionne
la source
.>
dans la sortie?p
) est plus court que l' ajout à chaque (;€
). Ces programmes de sortie doublent la cellule après l'impression et avant la commutation. Puisque nous ne revisitons jamais la cellule, cela n'affecte pas la sortie.Brainfuck,
5551 octetsEssayez-le en ligne!
Exemple de sortie pour
hi
(sans les sauts de ligne):Explication
Cela se déplace sur la bande lors de l'écriture du programme. L'environnement
,[...,]
est une boucle d'entrée standard. Pour chaque personnage, nous utilisons quatre cellules:où
x
est la cellule dans laquelle nous écrivons l'entrée.Cette partie utilise la cellule
a
pour écrire une21
dans la celluleb
via une multiplication standard de3
et7
.Maintenant, nous utilisons cela
21
pour écrire42
dansa
et63
enc
en multipliant par2
et3
respectivement. Puis<+<
Revient à la cellulex
tout en tournant la42
dans un43
(point de code+
). Résumer:Maintenant, la boucle de sortie principale:
Autrement dit, tout en décrémentant,
x
nous en imprimons un à+
chaque fois.Après avoir terminé, nous réutilisons la
+
cellule, en ajoutant3
pour donner.
.Enfin, nous passons au
63
, la décrémentons en62
(>
) et la sortie également. La prochaine itération utilisera cette cellule commex
.la source
Brainfuck,
39333231 octetsL'algorithme qui place 45 sur la bande est tiré des constantes Brainfuck d' Esolang .
Cette réponse suppose que l'interpréteur du programme de sortie a des cellules enveloppantes et délimitées; et cela
,
zéro la cellule actuelle (ce qui implique que le programme de sortie est exécuté sans entrée). Essayez-le en ligne!Pour une solution (plus longue) qui fonctionne sans condition, voir mon autre réponse .
Essai
Pour l'entrée
Code Golf
, la sortie suivante est générée.Essayez-le en ligne!
Comment ça fonctionne
Nous commençons par mettre l'entier 45 (code de caractère de
-
) dans une cellule de la bande. Le code suivant y parvient.Avant d'entrer dans la boucle, la bande ressemble à ceci.
Ces trois cellules - -2 , -1 et 0 - sont les seules que nous utiliserons dans ce programme.
Dans la première chaque itération de la boucle, la cellule la plus à droite est, puis cette cellule et la cellule du milieu sont décrémentées deux fois, laissant l'état suivant.
Dans les 126 itérations suivantes, l'initiale
-
décrémente la cellule du milieu,[>]<
saute à la cellule la plus à droite et--<--
décrémente la cellule du milieu et la cellule de droite. Par conséquent, 3 est soustrait de la cellule centrale (modulo 256 ) et 2 est soustrait de la cellule la plus à droite.Puisque 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 et 252 ÷ 3 = 84 , la cellule la plus à droite est mise à zéro avant celle du milieu, laissant l'état suivant.
Comme pour la première itération de la boucle, l'itération suivante soustrait maintenant 3 de la cellule du milieu et 2 de la cellule la plus à gauche, en plaçant la tête sur la cellule la plus à gauche.
Les itérations suivantes, comme dans l'itération 126 avant elles, soustraient 3 de la cellule la plus à gauche et 2 de la cellule la plus à droite.
Puisque 254 ÷ 3 (mod 256) = 170 et 129 ÷ 2 (mod 256) n'est pas défini, cela se fait 170 fois, laissant l'état suivant.
La cellule sous la tête est nulle; la boucle se termine.
Nous sommes maintenant prêts à générer une sortie.
la source
\0
.Brainfuck,
35 1343 octetsCette réponse ne fait aucune hypothèse sur l'interpréteur du programme de sortie. Essayez-le en ligne!
Pour une solution plus courte (qui ne fonctionne qu'avec certains interprètes), voir mon autre réponse .
Essai
Pour l'entrée
Code Golf
, la sortie suivante est générée.Essayez-le en ligne!
Comment ça fonctionne
Nous commençons par mettre l'entier 43 (code de caractère de
+
) dans la deuxième cellule de la bande. Le code suivant y parvient.Cela effectue essentiellement la division modulaire 2 ÷ 6 (mod 256) . Puisque (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , le résultat est 43 , comme prévu.
Nous sommes maintenant prêts à générer une sortie.
la source
Pyth - 11 octets
Essayez-le en ligne ici .
la source
05AB1E,
1211 octetsExpliqué
Essayez-le en ligne
1 octet enregistré grâce à @Adnan
la source
'+×
au lieu d'F'+}
enregistrer un octet.Java, 98 octets
String
les s ne sont rien de plus que deschar[]
s immuables avec un tas de méthodes utilitaires, alors utilisons le tableau!Non golfé:
Programme autonome équivalent de 138 octets de long:
Prime:
Cette application de 207 octets code en fait un fichier en tant que programme BF, comme indiqué dans le titre.
la source
Vitsy,
1917 octetsNotez que cette réponse est l'une des rares fois que j'ai jamais utilisée
I
etu
. :RÉEssayez-le en ligne!
la source
O , 13 octets
Explication:
la source
K6, 16 octets
Usage
Explication
la source
Python 3, 43 octets
Le Python met un certain nombre d'avantages équivalents au code ASCII de chaque caractère, suivi de
.>
pour imprimer et passer à la cellule suivante. Le brainfuck augmente jusqu'à la valeur correcte, imprime et passe à la cellule suivante.Sortie pour
hi
(avec des nouvelles lignes pour plus de clarté):Sortie de ce programme:
la source
Perl, 25 octets
Usage
Explication
Utilise une opération de remplacement d'expression régulière pour remplacer chaque caractère de chaque ligne donnée sur l'entrée standard par un nombre
+
calculé à partir de la valeur ordinale de ce caractère, puis sort.>
pour imprimer et passer au caractère suivant.Utilise l'
-p
indicateur perl pour lire automatiquement l'entrée et imprimer le résultat, en ajoutant 1 supplémentaire au bytecount.la source
Java, 91 octets
Accessoires à dorukayhan pour m'avoir battu :)
la source
C,
726460 octetsVersion non golfée:
Compilez et testez avec:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Résultats
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/la source
c
l'inverse au niveau du bitgetchar
, surtout si vous inversez simplement l'inversion?c = ~getchar( )
évalué à 0 activéEOF
.c = ~getchar( )
et~c++
sont tout simplement plus courts que~( c = getchar( ) )
etc--
CJam, 12 octets
Convertit chaque caractère en sa valeur ASCII et incrémente la cellule actuelle de ce nombre de fois avant de l'imprimer. Comme nous avons une bande infinie, nous pouvons simplement nous déplacer vers la droite après avoir traité chaque caractère.
Essayez-le en ligne!
la source
Lua,
676661 octetsParcourez simplement chaque caractère de l'argument et imprimez une ligne pour chacun avec
n
+
s suivi de.>
oùn
est la valeur de ce caractère dans la table ASCII.Utilise gmatch comme @LeakyNun conseillé dans le commentaire pour économiser 1 octet sur la solution gsub
Ancienne solution utilisant gsub
Vieux 67
Pour l'exécuter, il suffit de l'enregistrer en tant que fichier (
golf.lua
par exemple) et de l'exécuter aveclua golf.lua "hi"
. Pourhi
, il devrait sortirla source
attempt to index a nil value
etf = ...
donne la même chose etfunction f ... end
donneunexpected symbol near ':'
lua file.lua "argument"
, je mettrai à jour le message pour donner des instructions....
un identifiant avec argv?...
contient les valeurs de la tablearg
décompressée. Ce qui signifie qu'il correspondra toujours àarg[1]
moins que vous ne l'utilisiez dans un appel de fonction comme dernier paramètre, il sera dépensé.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
pour 48 octetsJ, 28 octets
Assez simple.
3&u:
convertit les caractères en codes de caractères. Le reste est simplement répéter'+'
ce nombre de fois, puis concaténer avec.>
à la fin de chaque ligne, et;
aplatit le résultat.Quelques résultats
la source
Pyke, 11 octets
Essayez-le ici!
la source
En fait, 13 octets
Essayez-le en ligne!
La stratégie utilisée ici est la même que dans la plupart des autres solutions - pour chaque caractère, sortez suffisamment de
+
s pour incrémenter une cellule initialisée à zéro au bon ordinal ASCII, sortez-la avec.
et passez à la cellule suivante avec>
.Explication:
la source
Souris-2002, 27 octets
Cela fonctionne en théorie et selon la documentation du langage, mais l'implémentation de référence de l'interpréteur de Mouse semble avoir un bug où l'entrée de chaîne ajoute un
'
, donc poura
ces sortiesQui à son tour sort
a'
. Cela peut ou peut ne pas être correct, alors voici un long de 39 octets qui ne sort'
jamais et est donc probablement plus invalide.Ce qui donne une bonne sortie dans l'impl de référence. tant qu'il n'y a pas de
'
s :)Expliqué:
la source
Facteur, 58 octets
Fonctionne comme:
Étant donné que Factor est livré avec un interprète Brainfuck, il est simple à tester.
bfcat.factor
bfcat-tests.factor
production
Yay! ils passent tous.
la source
Rubis,
4038 octetsla source
puts
place deprint
, car le format de la sortie n'est pas significatif tant qu'il est valide brainfuck et brainfuck ne se soucie pas des autres personnagesSidef , 38 octets
Hé, la même longueur que Ruby! juste que Sidef n'est pas Ruby: D
Lisez quelques caractères, puis pour chaque octet, faites cette chose.
la source
GNU Bash,
10085 octetsMerci @cat de m'avoir sauvé 15 octets!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Non golfé
Références en version non golfée
Lire le fichier octet par octet
ord
d'un char en bashémettre le caractère $ n fois
la source
read -rn1
:, débarrassez-vous des espaces après;
, débarrassez-vous de l'espacedone <"$1"
pour économiser un total de 9 octetsES6,
119115 octetsf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
4 octets enregistrés grâce à @Leibrug
la source
charCodeAt
à certains var (disonsc
) et utiliser comme ça:s[c](i)
pour raccourcir de 1 octet, et aussi supprimer certains caractères (j'ai trouvé 3: espace avant[...s]
, remplacez OR logique par un bit et un point-virgule avantreturn
).Sesos (non compétitif)
Hexdump:
Essayez-le en ligne!
Assembleur
la source
Rubis, 26 octets
+ 1 octet pour l'
p
option de ligne de commande. Par exemple, pour obtenir le code brainfuck pourABC xyz
vous pouvez exécuteret obtenir
la source
Haskell 50 octets
la source