Nous connaissons tous, ou du moins avons entendu parler de brainfuck , l'une des langues ésotériques les plus célèbres et les plus influentes. Alors que de nos jours la plupart des implémentations utilisent une bande infinie, le compilateur original d'Urban Müller avait une bande de 30000 cellules. Un fait peu connu * est qu'il y a en fait une valeur spéciale à la fin de la bande, quelque chose qui n'est presque jamais interagi avec un programme typique de brainfuck.
Bien que vous puissiez imprimer cette valeur avec 29999 >
s et a .
, brainfuck est connu pour ses solutions courtes et concises, votre objectif est donc d'imprimer cette valeur avec le nombre minimum de caractères.
*fiction
Règles:
- Un rappel sur les instructions de brainfuck:
+
/-
: Incrémente / décrémente la cellule actuelle, en passant de 255 à 0 lorsque 255 est incrémenté et vice-versa<
/>
: Déplacer le pointeur vers la gauche / droite sur la bande.
: Imprime la valeur de la cellule actuelle.[
: Aller au correspondant]
si la valeur dans la cellule est 0]
: Aller au correspondant[
si la valeur de la cellule n'est pas 0
- Dans ce cas
,
(Get input) ne fait rien, car le compilateur d'origine laisse la cellule inchangée sur EOF, et ce programme ne doit recevoir aucune entrée. - La bande est initialement remplie de tous les 0, à l'exception de la cellule 30000, qui contient une valeur inconnue
- Le pointeur commence à la cellule 1 et doit se terminer sur la cellule 30000, après l'avoir imprimé.
- Les cellules situées à gauche de 1 et à droite de 30000 ont un comportement indéfini, les solutions ne doivent donc pas visiter ces cellules.
- Notez que la valeur à 30000
estpeut-être un 0, donc une simple boucle jusqu'à ce que vous atteigniez une cellule non nulle ne fonctionnera pas. - Vous devez imprimer uniquement la valeur dans la cellule 30000
- La solution la plus courte gagne!
- Tie-breaker est le programme le plus efficace (s'exécute dans les moindres étapes), suivi du temps de soumission le plus rapide.
Astuce: Esolanging Fruit suggère d'utiliser https://copy.sh/brainfuck pour tester votre code. Les spécifications sont telles que décrites dans ce défi, et vous pouvez sélectionner l' abort
option pour que votre programme s'arrête s'il sort des limites.
.
. Je gagne.Réponses:
54 octets
119 x 252 = 29988. Boucle imbriquée simple.
J'ai utilisé cet outil pour vérifier que le pointeur s'arrête à 29999.
la source
50 octets
Essayez-le ici!
La première section (
>+[>+[<]>->+]>-<<
) configure la bande commeLa section suivante (
[>>-------[[>]+[<]>-]<<-]
) répète 121 fois, en ajoutant1
à chaque fois 249 s à la fin de la bande. Si vous êtes rapide avec les mathématiques, vous vous rendrez peut-être compte que ces résultats de 121 * 249 donnent 301291
s, mais la première itération a le reste de 110 à traiter et ajoute seulement (110-7
) 1031
s à la bande, ce qui signifie qu'il n'y a que 299831
s. La bande finale ressemble à ceci:Et une finale
>>>[>]>.
pour imprimer la valeur.Quelques autres algorithmes à noter:
la source
81
Cela se déplace de 150 cellules 200 fois.
C'est beaucoup plus long que je ne le souhaiterais, et il y a un sérieux obstacle au golf:
Je ne sais plus pourquoi je travaille.
Ceci est parsemé de compensations pour les hors-jeu au point que certains d'entre eux pourraient probablement annuler. J'ai tellement ajouté et supprimé divers segments que je ne me souviens plus pourquoi je place certaines choses là où elles se trouvent (par exemple, pourquoi la première partie initialise-t-elle les cellules de bande à 199 et 151 au lieu de 200 et 150?).
Voici ma version commentée de cette monstruosité de toute façon, dans l'espoir que je (ou quelqu'un d'autre) puisse les trouver utiles:
la source
.
, cela aiderait-il?