Imaginez un chemin composé de <
et >
et se terminant par un @
, par exemple ,
><>@
Un marcheur démarre sur la cellule la plus à gauche. Il parcourra le chemin comme suit:
- Si le marcheur est sur une
@
cellule, il a atteint le but et c'est fait. - Si le marcheur se trouve sur une
>
cellule, le chemin entier se déplace d'un pas vers la droite, cycliquement, en emmenant le marcheur avec lui . - Si le marcheur se trouve sur une
<
cellule, le chemin entier se déplace d'un pas vers la gauche, cycliquement, en emmenant le marcheur avec lui . - Ensuite, le promeneur fait un pas. S'il est à l'une ou l'autre extrémité du chemin, il s'éloigne de la fin. Sinon, il continue de se déplacer dans la direction dans laquelle il s'est déplacé au dernier pas (en ignorant la rotation), en marchant à droite au départ.
Examinons l'exemple ci-dessus. La position du marcheur est marquée par ^
:
><>@ --rotate--> @><>
^ ^
step right (first step):
@><> --rotate--> ><>@
^ ^
step right:
><>@ --rotate--> @><>
^ ^
step left (dead end):
@><> --rotate--> ><>@
^ ^
step left:
><>@ --rotate--> @><>
^ ^
step left:
@><> Goal reached!
^
Le marcheur a visité 6 cellules dans le processus (y compris la cellule de départ ainsi que la @
, et en comptant chaque cellule aussi souvent qu'elle est visitée).
Voici un petit exemple, où le marcheur est transporté sur les bords par une rotation:
>>@ --rotate--> @>>
^ ^
step right (first step):
@>> --rotate--> >@>
^ ^
step right (dead end):
>@> Goal reached!
^
Cette fois, le promeneur a visité 3 cellules.
Nous pouvons facilement transformer cela en une séquence entière:
- On vous donne un entier positif N , par exemple
9
. - Vous calculez la représentation binaire de cet entier, par exemple
1001
. - Ensuite , tournez
1
dans>
et0
en<
et ajouter un@
:><<>@
. - Nous associons à N le nombre de cellules visitées par le promeneur dans le nombre ainsi construit.
Les premiers éléments de la séquence résultante sont:
2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7
Cela peut sembler assez arbitraire, mais la séquence résultante se révèle en réalité avoir beaucoup de structure:
Pour référence, vous pouvez trouver les 2048 premiers numéros de la séquence dans cette boîte à pâte .
Le défi
Vous l'avez deviné: vous devez calculer la séquence ci-dessus. Vous pouvez le faire de trois manières:
- Vous pouvez produire une séquence infinie (alors que la mémoire le permet), soit en émettant en continu (séparés par des caractères non numériques) des valeurs ou en utilisant une certaine forme de générateur infini dans les langues qui les prennent en charge. Si vous imprimez un flux infini sur STDOUT, vous n'êtes pas obligé d'imprimer les nombres un par un, mais assurez-vous que chaque numéro sera imprimé après une durée limitée (et dans l'ordre). Si vous utilisez cette option, vous ne devez prendre aucune entrée.
- Vous pouvez prendre un entier N en entrée et produire le N ème terme de la séquence.
- Vous pouvez prendre un nombre entier N en entrée et tout produit jusqu'à la N ième terme de la séquence, que ce soit sous forme de liste ou d'une chaîne à l' aide d' un séparateur non ambiguë.
Comme je ne veux pas pénaliser les langages qui ne peuvent pas facilement être convertis entre les bases, au lieu de l'entier N, vous pouvez plutôt prendre la représentation binaire de N , en utilisant 0
s et 1
s comme d'habitude (comme une liste ou une chaîne), avec le plus - bit significatif en premier.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Les règles de code-golf standard s'appliquent.
Contexte
Cela calcule en fait le nombre de "ticks" qu'un interprète direct de mon langage de programmation ésotérique Labyrinth aurait besoin d'interpréter le "chemin" comme code source. Dans ce cas, le "marcheur" est simplement le pointeur d'instruction (qui a une position et une direction), la @
commande termine le programme <
et ce >
sont des commandes de modification du code source.