Brain-Flak (un croisement entre Brainf ** k et Flak-Overstow) est un langage ésotérique basé sur la pile. Depuis que ce défi a été publié, la langue a évolué et s'est mise à jour, mais cette première révision de la langue est connue sous le nom de "brain-flak classic".
Vous devez écrire un programme ou une fonction qui prend une chaîne de code classique Brain-Flak et l'évalue. Il prendra également une liste (éventuellement vide) d'entiers. Il y a les entrées du programme classique Brain-Flak.
La langue
Brain-Flak a deux piles, appelées «gauche» et «droite». La pile active commence à gauche. Si une pile vide est sautée ou consultée, elle renverra 0. Il n'y a pas de variables. Lorsque le programme démarre, chaque entrée est poussée dans la pile active dans l'ordre (de sorte que la dernière entrée se trouve au-dessus de la pile).
Les seuls caractères valides d'un programme Brain-Flak le sont ()[]{}<>
et ils doivent toujours être équilibrés . S'il y a des caractères non valides ou si les crochets ne correspondent pas, vous obtenez un comportement indéfini. Tout est valide.
Il existe deux types de fonctions: Nilades et Monades . Un nilad est une fonction qui prend 0 arguments. Voici toutes les nilades:
()
+1.[]
-1.{}
Pop la pile active.<>
Basculez la pile active.
Ceux-ci sont concaténés ensemble lorsqu'ils sont évalués. Donc, si nous avions un «3» au-dessus de la pile active, cet extrait de code:
()(){}
évaluerait à 1 + 1 + active.pop()
qui évaluerait à 5. est <>
évalué à 0.
Les monades prennent un argument, un morceau de code Brain-Flak. Voici toutes les monades:
(n)
Appuyez sur 'n' sur la pile active.[n]
Imprimez 'n' comme un int et une nouvelle ligne.{foo}
Pendant que active.peek ()! = 0, faites foo. Évalue à 0¹.<foo>
Exécutez foo, mais évaluez-le à 0.
Ces fonctions renverront également la valeur à l'intérieur d'eux, donc
(()()())
Poussera 3 et
[()()()]
Imprime 3 mais
[(()()())]
Imprime et pousse 3.
Lorsque le programme a terminé son exécution, chaque valeur restante sur la pile active est imprimée sous forme d'entier, avec une nouvelle ligne entre. Les valeurs de l'autre pile sont ignorées.
Règles:
Votre programme doit prendre en charge des nombres dans la plage (-128, 127) et une taille de pile d'au moins 255. Si vous prenez en charge plus grand, c'est parfait.
Le débordement / débordement n'est pas défini.
Exemple d'E / S:
Le programme vide:
Entrée: aucune
Sortie: aucune
Une addition. La source:
({}{})
Contribution:
2, 3
Production:
5
Soustraction. La source:
({}<>){({}[])<>({}[])<>}<>
Contribution:
2, 3
Production:
-1
Multiplication. La source:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>
Contribution:
7, 8
Production:
56
Fibonacci. La source:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>
Contribution:
5
Production:
13
8
5
3
2
1
1
{[({})]}
Les failles standard s'appliquent et la réponse la plus courte en octets l'emporte.
- ¹: C'était en fait une erreur de ma part.
{...}
devrait évaluer la somme de toutes ses courses, ce qui est l'OMI l'une des caractéristiques les plus cool de brain-flak. Cependant, pour les besoins de ce défi, supposons que{...}
vaut 0.
la source
{...}
évalue la monade ?{...}
évaluée à 0. De plus, les arguments sont poussés dans l'ordre, donc2
est poussé, puis3
est poussé, donc lorsque le programme démarre, la deuxième entrée (3
) est au-dessus de la pile. Je vais clarifier les deux dans le post.Réponses:
Pip
-n
,15114810198 octetsPrend la liste des entrées comme arguments de ligne de commande et le code Brain-Flak de (une ligne de) stdin. Essayez-le en ligne!
Modifier: j'ai sauvé beaucoup d'octets par rapport à mon approche d'origine en passant à une stratégie de traduction et d'évaluation.
Non golfé et commenté
Cette version inclut également une sortie de débogage montrant le code Pip résultant de la traduction, ainsi que le contenu de la pile après exécution.
la source
Brain-Flak Classic ,
127112471239 octetsEssayez-le en ligne!
+4 octets de correction d'un bug avec la condition dans la
{...}
monade, et -36 octets de divers golfs.1238 octets de code, +1 octet pour l'
-a
indicateur (qui peut être combiné avec l'indicateur de langue).Ceci est désormais évalué
{...}
à zéro selon la spécification de défi. Notez que Brain-Flak lui-même a été évalué{...}
comme la somme de toutes les exécutions depuis le correctif du 7 mai 2016, deux jours avant la publication de ce défi.Le code suivant interprète Brain-Flak Classic correctement, avec
{...}
la somme de toutes les exécutions. La seule différence entre les deux interprètes est le placement d'une{}
nilade.Essayez-le en ligne!
L'entrée (vers l'un ou l'autre interprète) est le programme Brain-Flak Classic à interpréter, puis une nouvelle ligne, puis une liste d'entiers séparés par des espaces. Aucune validation n'est effectuée sur l'entrée. La nouvelle ligne est requise, même si le programme ou l'entrée est vide.
La première étape consiste à analyser toutes les entrées, en commençant par les crochets:
Ensuite, les entiers sont analysés. Cela ne serait normalement pas requis, mais l'entrée a été prise en ASCII. Cela a cependant une doublure argentée: la saisie de texte nous permet de déterminer la hauteur de la pile, ce qui simplifie les choses lorsque nous n'avons pas accès à la hauteur de pile nilad.
Les nombres entiers sont analysés en deux nombres sur la deuxième pile: un pour la valeur absolue et un pour le signe. Ceux-ci sont ensuite replacés dans la première pile.
Les piles interprétées sont stockées sous le code de la première pile dans l'ordre suivant: hauteur de pile actuelle, pile actuelle, autre hauteur de pile, autre pile. Le 0 pour l'autre hauteur de pile n'a pas besoin d'être poussé à ce stade, car ce sera un zéro implicite la première fois qu'il sera lu.
La représentation du code est maintenant replacée dans la pile de gauche. Pour faciliter les choses plus tard, nous soustrayons 4 des parenthèses ouvrantes des nilades, de sorte que chaque opération ait un entier unique de -1 à -8.
La partie principale du programme consiste en fait à interpréter les instructions. Au début de chaque itération de la boucle principale, l'instruction en cours se trouve en haut de la pile de gauche, tout ce qui se trouve après en dessous sur la même pile, et tout ce qui se trouve avant de se trouver sur la pile de droite. J'ai tendance à visualiser cela comme ayant un livre ouvert sur une certaine page.
Après avoir quitté la boucle principale, tout le code est sur la bonne pile. Les seules choses sur la pile de gauche sont un zéro et les deux piles interprétées. Produire la sortie correcte est une question simple.
la source
{...}
, qui est le comportement correct pour le cerveau-flak moderne et (je pense) le cerveau-flak classique, cependant j'ai écrit dans le défi qui{...}
vaut 0. Vous pourriez probablement jouer au golf un nombre important d'octets de en supprimant cette fonctionnalité, même si ce serait bien de conserver l'original parce qu'il est techniquement plus correct en général (juste mal pour ce défi)APL,
255257 octetsCela prend le programme comme argument de droite et l'entrée du programme comme argument de gauche, c'est-à-dire:
Version non golfée: ici .
la source
APL (Dyalog Classic) , 146 octets
Essayez-le en ligne!
un classique en interprétant un autre :)
la source
Python 3, 429 octets
Utilisé comme
g('[{}{}]', 2, 3)
Il utilise
re.sub
pour «compiler» la source de brain-flak en python, puis exécute le python. (pour le débogage, remplacezexec
parprint
pour obtenir une liste du code python)Une indentation correctement imbriquée tandis que les boucles consomment beaucoup d'octets dans le code.
la source
Python, 616 octets
Instructions:
[1,2,...]
format, puis appuyez sur EntréeFondamentalement, ce programme fait "compile" récursivement le code Brain-flak dans des listes imbriquées et interprète récursivement cette liste. Il y a probablement un moyen de combiner les deux ...
Je vais essayer de retravailler la logique plus tard.
la source
Perl 5.6,
419414 octetsJe l'ai un peu joué au golf, mais il y a probablement des possibilités d'amélioration. Ajout de nouvelles lignes et d'onglets ici pour plus de lisibilité:
la source
Python 2 ,
361, 348 octetsEssayez-le en ligne!
-13 octets enregistrés grâce à @Mr. Xcoder!
la source