Parfois, lors de l'écriture de code brainfuck, vous ressentez le besoin de le rendre plus long que nécessaire pour encourager le débogage. Vous pourriez le faire en y insérant juste un ><, mais quel plaisir est-ce? Vous aurez besoin de quelque chose de plus long et moins de NOPey pour confondre quiconque lit votre code.
Introduction rapide à Brainfuck
Brainfuck est un langage de programmation ésotérique créé en 1993 par Urban Müller, et remarquable pour son minimalisme extrême. (Wikipédia)
Brainfuck est un langage basé sur huit commandes: +-><,.[]. Le code est exécuté sur quelque chose comme une machine de Turing: une bande infinie sur laquelle les valeurs peuvent être modifiées. Dans ce défi, nous nous concentrerons sur les quatre premiers:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
NOP Brainfuck
Un brainfuck NOP est une séquence de personnages brainfuck qui, lorsqu'ils sont exécutés à partir de n'importe quel état, ne conduisent à aucun changement d'état. Ils se composent des quatre caractères mentionnés ci-dessus.
Le défi
Le défi consiste à écrire un programme ou une fonction qui, une fois exécuté, génère un NOP de brainfuck aléatoire de la longueur donnée.
Contribution
Vous recevrez en entrée un entier pair non négatif n. (Les NOP sont impossibles à comprendre n.)
Sortie
Vous produirez un NOP de brainfuck aléatoire de la longueur n.
Règles
- La définition de NOP: lorsque la sortie du programme est insérée à tout moment dans un programme brainfuck, le comportement dudit programme ne doit en aucun cas changer. En d'autres termes, il ne doit pas changer l'état de l'interprète.
- Notez que, par exemple,
+>-<est incorrect, car il modifie les valeurs des deux cellules sans les modifier en arrière. Veuillez tester votre solution pour ces derniers avant de poster. - Notez également qu'il
+>-<->+<s'agit d'un NOP qui ne peut être réduit à rien simplement en le supprimant><<>+--+. Ainsi, vous ne pouvez pas utiliser un algorithme qui les insère simplement les uns dans les autres.
- Notez que, par exemple,
- Chaque NOP valide de la longueur
ndoit avoir une chance non nulle d'apparaître dans la sortie. La distribution ne doit cependant pas être uniforme. - L'interprète brainfuck en question a une bande doublement infinie de cellules de précision arbitraire. Autrement dit, vous pouvez aller à l'infini dans les deux directions et incrémenter / décrémenter chaque cellule indéfiniment.
- Le programme doit se terminer en 1 minute pour
n= 100 sur ma machine, donc pas de génération de tous les NOP possibles et d'en choisir un. - Si une entrée non valide (non entière, négative, impaire, etc.) est fournie, vous pouvez faire tout ce que vous souhaitez, y compris un crash.
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
Exemples
Voici toutes les sorties valides pour n= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Voici quelques sorties possibles pour n= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.a un effet secondaire, ,écrase une valeur qui ne peut pas être récupérée sans l'utilisation de []. Mais []finira par définir une valeur à zéro. Cela écrase également une valeur (nous en aurions donc besoin d'une autre []pour la récupérer), sauf si nous pouvons être sûrs que la cellule affectée était zéro au départ. Cependant, nous devions rechercher une telle cellule avec quelque chose comme [>], et il est impossible de retourner de manière fiable à la position d'où nous venons.
+-<>comme vous l'avez demandé:a