Prélude , 69 55 54 octets
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Si un interpréteur conforme standard est utilisé, cela prend l'entrée et la sortie comme valeurs d'octet . Pour utiliser réellement des nombres décimaux sur STDIN / STDOUT, vous auriez besoin de l'interpréteur Python avec NUMERIC_OUTPUT = True
et d'une option supplémentaire NUMERIC_INPUT = True
.
Explication
Le squelette du programme est
?1-( 1 -
1 )!
Nous lisons l'entrée N
sur la première voix et la décrémentons pour l'obtenir N-1
. Nous initialisons également la deuxième voix pour 1
. Ensuite, nous bouclons N-1
une fois, dont chaque itération obtient la valeur suivante de la séquence sur la deuxième pile. À la fin, nous imprimons le N
numéro e.
L'idée du programme est de mettre chaque élément de la séquence dans une file d'attente sur la troisième voix, et de décrémenter la tête de cette file d'attente à chaque itération. Lorsque la tête atteint 0
, nous incrémentons la valeur de la séquence et la supprimons 0
.
Maintenant, le problème est que Prelude utilise des piles et non des files d'attente. Nous devons donc déplacer un peu cette pile pour l'utiliser comme une file d'attente.
v #
0v ^
(#)
Cela copie la valeur actuelle de la séquence sur la première voix (en tant que copie temporaire), pousse a 0
sur la deuxième voix (pour marquer la fin de la file d'attente). Et effectue ensuite une boucle pour décaler (et ainsi inverser) la troisième pile sur la seconde. Après la boucle, nous mettons la copie de la valeur de séquence actuelle au-dessus de la deuxième pile (qui est la queue de notre file d'attente).
)
(#
^#1-
Cela semble un peu moche, mais c'est essentiellement une boucle qui ramène la pile sur la troisième voix. Étant donné que le )
est dans la même colonne que les instructions de décalage, le 0
nous avons mis sur la deuxième voix plus tôt se retrouvera également sur la troisième voix, nous devons donc le supprimer avec un autre #
. Puis décrémentez le haut de la 3ème voix, c'est-à-dire la tête de file d'attente.
Maintenant, cela devient un peu ennuyeux - nous voulons exécuter du code lorsque cette valeur est 0
, mais la seule structure de contrôle de Prelude (la boucle) ne répond qu'aux valeurs non nulles.
0 (1+0)#
(0)#
Notez que le haut de la deuxième voix est véridique (puisque la séquence de Golomb ne contient aucun 0
s). La charge de travail va donc dans cette voix (la dernière paire de parenthèses). Nous devons juste empêcher cela de se produire si le chef de file d'attente n'est pas 0
encore. Donc, d'abord, nous avons une "boucle" sur la troisième voix qui pousse a 0
sur la deuxième voix si la tête de la file d'attente est toujours non nulle. Nous avons également mis une 0
troisième voix pour quitter la boucle immédiatement. Le #
sur la troisième voix , puis supprime non plus que 0
, ou supprime le chef de la file d' attente si c'était déjà nul. Maintenant, cette deuxième boucle n'est entrée que si la tête de la file d'attente était nulle (et le0
sur la deuxième voix n'a jamais été poussé). Dans ce cas, nous incrémentons la valeur actuelle de la séquence et appuyons sur a 0
pour quitter la boucle. Enfin, il y aura toujours un 0
sur le dessus de la pile, que nous devons jeter.
Je vous ai dit que la négation logique est ennuyeuse dans Prelude ...
n
plutôt que2 - n % 1
. Avez-vous des raisons de vous attendre à ce que les réponses soient sensiblement différentes?