La cellule au bout de l'arc-en-ciel


31

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 est peut-ê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' abortoption pour que votre programme s'arrête s'il sort des limites.


Sandbox (supprimé)
Jo King

3
1 octet: .. Je gagne.
Esolanging Fruit

1
@EsolangingFruit Permettez-moi d'avoir mes illusions s'il vous plaît ...
Jo King

1
Je suggère de changer la règle en "initialement toutes les cellules ont la valeur 0, sauf la dernière cellule qui a une valeur inconnue".
user202729

4
Astuce pour quiconque fait cela: copy.sh/brainfuck est probablement le meilleur site pour le faire, car il implémente BF comme décrit dans ce défi et a une bande de 30k par défaut. Le passage juste après la fin de la bande provoque le blocage de l'interpréteur.
Esolanging Fruit

Réponses:


17

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.


12

50 octets

>+[>+[<]>->+]>-<<[>>-------[[>]+[<]>-]<<-]>>>[>]>.

Essayez-le ici!

La première section ( >+[>+[<]>->+]>-<<) configure la bande comme

0*12 121' 0 110

La section suivante ( [>>-------[[>]+[<]>-]<<-]) répète 121 fois, en ajoutant 1à 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 30129 1s, mais la première itération a le reste de 110 à traiter et ajoute seulement ( 110-7) 103 1s à la bande, ce qui signifie qu'il n'y a que 29983 1s. La bande finale ressemble à ceci:

0*12 0' 0 0 1*29983 0 ???

Et une finale >>>[>]>.pour imprimer la valeur.

Quelques autres algorithmes à noter:

  • 252 * 119 = 29988 (également 50 octets)
  • 163 * 184 = 29992 (56 octets)
  • 204 * 147 = 29988 (60 octets)
  • 153 * 196 = 29988 (56 octets)
  • 191 * 157 = 29987 (57 octets)
  • 254 * 118 = 29972 (56 octets)
    • Celui-ci est celui que je considère comme le plus proche de battre 50, car les octets supplémentaires ne font que parcourir la distance supplémentaire. Si je pouvais trouver un algorithme qui génère 118 et voyage plus de 14 cellules, cela pourrait le battre.

3

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:

-[+>+[<]>++]<<+[-->-[-<]>]>-

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

Cela n'imprime pas réellement la valeur, et si la valeur est positive, elle déborde. Mais une grande tentative
Jo King

Ajoutez ensuite un ., cela aiderait-il?
user202729

1
@JoKing a corrigé cela.
Esolanging Fruit
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.