RLE Brainfuck
(lié à BF-RLE )
L'hypothétique dialecte RLE ( Run-Length Encoding ) de Brainfuck accepte les symboles pour les 8 commandes et accepte également les chiffres. Les chiffres sont utilisés pour représenter le nombre de répétitions successives d'une commande, permettant ainsi le codage sur toute la durée du code source.
8>
est égal à >>>>>>>>
.
La longueur est toujours sur le côté gauche de la commande.
Votre tâche consiste à écrire le programme / la fonction la plus courte qui traduit la chaîne d'entrée (fragment RLE Brainfuck) en un programme Brainfuck normal.
Par exemple:
Contribution:
10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.
Ouptut:
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
Le code le plus court en nombre d'octets dans chaque langue gagnera.
Réponses:
Python 2 ,
6261 octetsEssayez-le en ligne!
La substitution d'expression régulière se développe
3<2+-
dans la chaîne:qui est ensuite
eval
éd. (Notez comment quand\1
est vide, nous obtenons1**1 = 1
.) Le premier+
est un opérateur unaire qui se lie au premier nombre, et les autres+
s sont la concaténation de chaînes. Cela bat le plus évidentde 14 octets. Normalement,
"\2"
cela ne fonctionnerait pas toujours, mais heureusement\
, ce"
ne sont pas des commandes de cerveau.xnor a enregistré un octet, fournissant l'
1*\1*1
astuce. Auparavant, je l'avais\1L
dans l'expression régulière, et définiL=1
comme un argument lambda, qui est également assez cool:3L
est un littéral long int etL
est une variable.la source
L
pour gérer la chaîne vide. Il y a un chemin plus court cependantr'+1*\1*1*"\2"'
.import re
dessous de la lambda?f=\
le Header - maintenant le lambda a un nom!)Pyth , 2 octets
Essayez-le ici!
Comment ça fonctionne
la source
Lua,
656463 octetsGénial ! Pour une fois, Lua bat Python!Edit: Sauvegardé un octet grâce à @Jarhmander, merci à lui pour l'astuce utile pour forcer un seul résultat
Essayez-le en ligne!
Explications
la source
,""
et en mettant entre parenthèses l'intégralité de l'argument d'impression. Les expressions entre parenthèses sont ajustées à une valeur en Lua (voir lua.org/manual/5.3/manual.html#3.4 ).Scala ,
7369 octetsEssayez-le en ligne!
la source
Perl 5 , 18 octets
Code de 17 octets + 1 pour
-p
.Essayez-le en ligne!
la source
vim,
2925232216 octets<C-V>
est 0x16,<ESC>
est 0x1b.Il fonctionne en remplaçant chaque non-chiffre par une commande qui ajoute ce caractère au tampon. Les comptes sont laissés seuls et modifient ces commandes. À ce stade, le tampon est un programme vimscript qui produit le programme Brainfuck souhaité, nous le tirons donc dans un registre et l'exécutons.
Essayez-le en ligne!
Edit: Réductions de taille grâce aux suggestions: H.PWiz: 5, TheFamilyFroot: 5, DJMcMayhem: 1
la source
&
ou\0
) à la place sans parenthèses. En outre, un bout de moi, pas TheFamilyFroot est que vous pouvez utiliserD
lieu dedd
pour-1
octet.RLE Brainfuck, 204 octets
Si je comprends bien, les spécifications de l'environnement brainfuck ne sont pas très bien définies. Ce programme suppose que les cellules de la bande autorisent des entiers positifs et négatifs arbitrairement grands, sans débordement. Ce code transcrira également les commentaires non liés aux commandes, mais il étendra l'encodage de la durée des commentaires (par exemple, "voir 3b" → "voir bbb"). Le programme résultant devrait fonctionner de la même manière, donc je ne suis pas trop inquiet.
Je suis sûr que je pourrais encore jouer au golf à quelques octets, mais je suis épuisé de travailler avec.
Voici l'interpréteur personnalisé + tests que j'ai utilisé pour le tester. Si vous passez cette entrée dans la zone Entrée standard, elle doit s'exécuter sur cette entrée au lieu d'exécuter les tests.
Mon workpad désordonné et désordonné:
la source
10+
? L'OP a précisé dans un commentaire que le nombre sera toujours supérieur à 0, donc vous pourriez être en mesure de raser certains octets si c'est le premier.while max
boucle s'exécute toujours au moins une fois et que je monte inconditionnellement le tampon dans lequel je stocke la valeur du chiffre dans cette boucle, je dois démarrer ce tampon à -1. Je me demande si je pourrais économiser quelques octets en laissant ce tampon logiquement àvalue+1
thoughEmpilé , 24 octets
Essayez-le en ligne!
Explication
la source
TeX, 124 octets
(écrit en deux lignes pour être visible, mais le code peut être écrit en une seule ligne)
Cela définit une macro
\b
qui prend l'entrée dans le formulaire\b<input>;
et imprime la sortie souhaitée dans le document.la source
Rétine ,
2823 octetsmerci à @Leo pour -5 octets
Essayez-le en ligne!
la source
\b
dans le deuxième regex pour correspondre à un seul1
par série de1
s?Pyon , 66 octets
Essayez-le en ligne!
Pyon est à peu près juste Python, mais c'est plus court car
re
est automatiquement importé lorsque vous l'utilisez eta
est automatiquement défini sur un argument ou l'entrée-4 octets grâce à M. Xcoder
la source
g[0]
àg[:-1]
(échoue pour le scénario de test donné ou tout nombre supérieur à 9).lambda
qui gaspille des octets? Golfé et corrigé pour 66 octetsPython 2 ,
1009389 octets-7 avec merci à Mr.Xcoder
Essayez-le en ligne!
la source
Haskell , 60 octets
Essayez-le en ligne!
la source
R ,
12110690 octetsEssayez-le en ligne!
15 octets enregistrés en réalisant que
rep()
cela contraindra le numérique. 16 autres sauvés grâce à Giuseppe, principalement de l'utilisation depmax
pour remplacer les chaînes vides par1
la source
ifelse(x>"",x,1)
c'est un octet plus court, et\\D
est équivalent[^\\d]
et surtout, vous n'avez pas besoinperl=T
, c'est donc un doux 99 octets . Je ne pensais vraiment pas que cela pouvait être inférieur à 100 octets!pmax
pmax
donner une belle amélioration importante - merci!"1"
par1
commepmax
le contraindra àcharacter
la comparaison.PowerShell ,
6662 octetsEssayez-le en ligne!
Panne
Quel bordel!
A partir de
$args
, qui est un tableau d'éléments unique contenant la chaîne RLE, je force dans une chaîne réelle en l'encapsulant entre guillemets.Ensuite, divisez-le par limite de mot (
\b
en regex). Cela me donnera un tableau de chaînes, où chaque élément est soit un nombre, soit le ou les jetons BF qui viennent après le nombre. Ainsi , dans l'exemple, les 4 premiers éléments de ce tableau de répartition sont10
,+]>+>
,3
,+>
(tous sont string).Ensuite, je redirige cela dans
ForEach-Object
(%
) pour gérer chaque élément .Le milieu est un golfisme PowerShell bien connu, avec une touche; il s'agit essentiellement d'un opérateur ternaire bricolage, dans lequel vous créez un tableau à 2 éléments, puis l'indexez à l'aide de l'expression booléenne que vous souhaitez tester, un faux résultat vous donnant l'élément 0 et un vrai résultat vous donnant l'élément 1.
Dans ce cas, je crée en fait un tableau à élément unique avec la virgule unaire
,
, car je ne veux pas de sortie dans le vrai cas.Examinons d'abord l'indexeur, même s'il est exécuté plus tard.
L'idée est que
$_
(l'élément actuel) peut être soit un nombre valide, soit une autre chaîne. Si c'est un nombre, je veux$n
être la valeur de ce nombre moins 1 (comme un nombre, pas une chaîne). Si ce n'est pas le cas, je veux$n
être faux-y.PowerShell essaie généralement de contraindre la valeur de droite au type du côté gauche, mais cela peut dépendre de l'opération. Par ailleurs,
"10"+5
vous donnera une nouvelle chaîne"105"
, tandis que10+"5"
vous donnera un entier (15
).Mais les chaînes ne peuvent pas être soustraites.Par conséquent, PowerShell peut déduire automatiquement la valeur numérique avec une chaîne sur le côté gauche de la soustraction, donc
"10"-5
donne5
.Donc, je commence par
$_-1
, ce qui me donnera le nombre que je veux quand$_
c'est en fait un nombre, mais quand ce n'est pas le cas, je ne reçois rien. En surface, "rien" n'est falsey, mais le problème est qu'il arrête l'exécution de cette affectation, il$n
conservera donc sa valeur précédente; pas ce que je veux!Si je l'enveloppe dans une sous-expression, puis quand il échoue, j'obtiens ma valeur de falsey:
$($_-1)
.Que tout est attribué à
$n
et puisque cette affectation est elle-même enveloppée entre parenthèses, la valeur qui a été affectée à$n
également transmise au pipeline.Étant donné que je l'utilise dans l'indexeur et que je souhaite
1
que la conversion réussisse, j'utilise deuxnot
expressions booléennes!!
pour convertir cette valeur en booléen. Une conversion de nombre réussie se termine comme vraie, tandis que le néant de falsey nous donne ce doux, doux0
qui permet de retourner le seul élément de ce faux tableau ternaire.Pour en revenir à ce tableau, l'élément est le suivant:
$("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- c'est un moyen ennuyeusement long d'obtenir le premier caractère de l'élément courant (disons, en+
provenance de+[>+
), mais en tant que chaîne et non en tant[char]
qu'objet. J'ai besoin que ce soit une chaîne car je peux multiplier une chaîne par un nombre pour la dupliquer, mais je ne peux pas le faire avec un caractère.En fait, j'ai réussi à enregistrer 4 caractères en utilisant un
[char]
tableau au lieu d'une chaîne (en utilisant une autre virgule unaire,
), j'ai donc pu supprimer les guillemets et la sous-expression supplémentaire. Je peux multiplier un tableau pour dupliquer ses éléments. Et puisque le résultat entier de cette itération finit par être un tableau de toute façon et doit être-join
modifié, l'utilisation d'un tableau ici n'entraîne aucun coût supplémentaire.Ensuite, je multiplie ce tableau de
chaînespar$n
, pour le dupliquer$n
fois. Rappelez-vous que cela$n
pourrait être$null
ou ce pourrait être la valeur des chiffres précédents moins un.+$_
Ajoute ensuite l'élément en cours à la fin du premier caractère dupliqué de cet élément. C'est pourquoi$n
est moins un.De cette façon,
10+[>+
finit par$n
égal à 9, puis nous faisons 9+
et ajoutons cela à la+[>+
chaîne pour obtenir les 10 requis, ainsi que les autres éléments individuels le long du trajet.L'élément est encapsulé dans une sous
$()
- expression parce que quand$n
est$null
, l'expression entière échoue, donc la création du tableau échoue, donc l'indexeur ne s'exécute jamais, donc$n
n'est jamais attribué.La raison pour laquelle j'ai utilisé cette astuce ternaire est due à l'une de ses particularités: contrairement à un véritable opérateur ternaire, les expressions qui définissent les éléments ne s'évaluer si oui ou non ils sont « sélectionnés », et d' abord pour cette question.
Étant donné que je dois attribuer puis utiliser
$n
sur des itérations distinctes, cela est utile. La valeur de l'élément de tableau ternaire est évaluée avec la$n
valeur de l'itération précédente , puis l'indexeur est réaffecté$n
pour l'itération en cours.Ainsi, les
ForEach-Object
boucles finissent par produire tout ce qu'elles sont censées (un tas d'erreurs que nous ignorons), mais comme un tableau de nouvelles chaînes.Donc, tout cela est entouré de parenthèses, puis précédé d'unaire
-join
pour donner la chaîne de sortie.la source
QuadR , 17 octets
Essayez-le en ligne!
Merci à Adám d' avoir fourni la bonne version du code.
Comment ça fonctionne:
la source
'\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
Proton , 50 octets
Essayez-le en ligne!
la source
Java 8, 148 octets
Les fichus regexJava sont si inutiles parfois .. La dernière fois, c'était lemanque d'utiliser le groupe de capture"$1"
pour rien, maintenant ça .. Je veux remplacer3c
parccc
ou000c
avecccc
comme une seule ligne, mais malheureusement Java n'a aucun moyen de le faire sans un boucle. Et bien.Explication:
Essayez-le ici.
la source
Haskell , 84 octets
Essayez-le en ligne!
Explication:
span(`elem`['0'..'9'])s
divise la chaîne données
en un préfixe de chiffres et le reste. Faire correspondre le résultat sur le modèle(n:m,x:r)
garantit que le préfixe numérique n'est pas vide et lie le caractère après les chiffres àx
et le reste àr
.x<$[1..read$n:m]
lit la chaîne de chiffresn:m
sous forme de nombre et la répètex
plusieurs fois. Le résultat est concaténé au traitement récursif de la chaîne restanter
.la source
R , 151 octets
Dépassé par user2390246 ! C'est maintenant fondamentalement une approche ordonnée par rapport à celle-là, mais je vais continuer à l'améliorer.
Essayez-le en ligne!
Émet également un tas d'avertissements.
Ensuite, voir si l'utilisation d'un
grep
est plus efficace quesubstr
la source
JavaScript (ES6), 46 octets
Explication assez simple:
la source
Rubis , 35 octets
Essayez-le en ligne!
la source
Calcul lambda non typé , 452 octets
L'entrée et la sortie comprennent des listes à droite des codes de caractères codés par église , par exemple le code de caractère d'une nouvelle ligne est 10, de sorte que le codage par église le serait
λf.λx.f(f(f(f(f(f(f(f(f(f x)))))))))
. La conversion de "ABCD" en liste ressemble àλf.λx.f 65 (f 66 (f 67 (f 68 x)))
mais avec les nombres encodés par l'église.Appliquer une chaîne codée au programme et la réduire complètement devrait vous donner une chaîne de sortie codée avec le RLE appliqué.
la source
qλq
notation? Je n'avais jamais vu ça auparavant.Funky , 42 octets
Essayez-le en ligne!
la source
C ++,
239235 octets-4 octets grâce à Zacharý
la source
g=(g?g:1)
pourg+=!g
? Si cela ne fonctionne pas, ne pouvez-vous pas supprimer les parenthèses autourg?g:1
Dart, 78 octets (avec regex), 102 octets (sans regex)
Avec Regex:
Sans regex:
Les deux doivent être invoqués comme
(<code here>)("input string")
.L'un regex est assez standard, mais celui sans regex est assez spécial.
Sans regex abuse des paramètres optionnels pour allouer des variables locales dans la fonction "single return", sinon vous auriez besoin de faire un bloc et d'avoir le mot-clé return. Pour chaque unité de code, si l'unité de code est comprise entre 0 et 9, elle est cumulée
n
et une chaîne vide est renvoyée. Sinon, le caractère est multiplié par la valeur den
(casse spéciale si n == 0, dans ce cas, il émettra toujours 1 caractère) etn
est défini sur 0.(n=0*(c=n))+c
définit l'argument du code char à la valeur den
, multiplien
/c
avec 0 , stocke 0 àn
, puis ajoutec
. Cela réinitialise notren
sans être dans un contexte de déclaration.la source
Python3, 96 octets
J'ai essayé une autre implémentation en Python, mais je ne bat pas /codegolf//a/146923/56846 :(
la source