Cubix, 33 32 octets
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Forme nette:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Essayez-le en ligne!
Remarques
- Fonctionne avec des entrées jusqu'à 170 inclus, les entrées plus élevées entraînent une boucle infinie, car leur factorielle donne le
Infinity
nombre (techniquement parlant, c'est une propriété non inscriptible, non énumérable et non configurable de l'objet fenêtre).
- La précision est perdue pour les entrées 19 et supérieures, car les nombres supérieurs à 2 53 (= 9 007 199 254 740 992) ne peuvent pas être stockés avec précision dans JavaScript.
Explication
Ce programme se compose de deux boucles. Le premier calcule la factorielle de l'entrée, l'autre divise le résultat en ses chiffres et les additionne. Ensuite, la somme est imprimée et le programme se termine.
Début
Tout d'abord, nous devons préparer la pile. Pour cette partie, nous utilisons les trois premières instructions. L'IP commence sur la quatrième ligne, pointant vers l'est. La pile est vide.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Nous conserverons la somme tout en bas de la pile, nous devons donc commencer par 0
être la somme en la stockant au bas de la pile. Ensuite, nous devons appuyer sur a 1
, car l'entrée sera initialement multipliée par le nombre précédent. Si c'était zéro, la factorielle donnerait toujours aussi zéro. Enfin, nous lisons l'entrée comme un entier.
Maintenant, la pile est [0, 1, input]
et l'IP est à la quatrième ligne, la quatrième colonne, pointant vers l'est.
Boucle factorielle
Il s'agit d'une simple boucle qui multiplie les deux premiers éléments de la pile (le résultat de la boucle précédente et de l'entrée - n, puis décrémente l'entrée. Elle se rompt lorsque l'entrée atteint 0. L' $
instruction fait que l'IP saute le u
- La boucle est la partie suivante du cube. L'IP commence à la quatrième ligne, quatrième colonne.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
En raison du ^
caractère, l'IP commence immédiatement à se déplacer vers le nord. Ensuite, le u
tourne autour de l'IP et le déplace vers la droite. En bas, il y a une autre flèche: <
pointe l'IP dans le ^
. La pile commence comme [previousresult, input-n]
, où n
est le nombre d'itérations. Les caractères suivants sont exécutés dans la boucle:
*s(
* # Multiply the top two items
# Stack: [previousresult, input-n, newresult]
s # Swap the top two items
# Stack: [previousresult, newresult, input-n]
( # Decrement the top item
# Stack: [previousresult, newresult, input-n-1]
Ensuite, le haut de la pile (entrée diminuée) est vérifié 0
par l' !
instruction, et si c'est le cas 0
, leu
caractère est ignoré.
Additionnez les chiffres
L'IP s'enroule autour du cube, se terminant sur le tout dernier caractère de la quatrième ligne, pointant initialement vers l'ouest. La boucle suivante comprend à peu près tous les caractères restants:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
La boucle supprime d'abord l'élément supérieur de la pile (qui est soit 10
ou 0
), puis vérifie ce qui reste du résultat de la factorielle. Si cela a été réduit à 0
, le bas de la pile (la somme) est imprimé et le programme s'arrête. Sinon, les instructions suivantes sont exécutées (la pile commence comme [oldsum, ..., factorial]
):
N%p+q;;,s;
N # Push 10
# Stack: [oldsum, ..., factorial, 10]
% # Push factorial % 10
# Stack: [oldsum, ..., factorial, 10, factorial % 10]
p # Take the sum to the top
# Stack: [..., factorial, 10, factorial % 10, oldsum]
+ # Add top items together
# Stack: [..., factorial, 10, factorial % 10, oldsum, newsum]
q # Send that to the bottom
# Stack: [newsum, ..., factorial, 10, factorial % 10, oldsum]
;; # Delete top two items
# Stack: [newsum, ..., factorial, 10]
, # Integer divide top two items
# Stack: [newsum, ..., factorial, 10, factorial/10]
s; # Delete the second item
# Stack: [newsum, ..., factorial, factorial/10]
Et la boucle recommence, jusqu'à ce qu'elle factorial/10
soit égale à 0.
n>21