Cubix, 33 32 byte
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Modulo netto:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Provalo online!
Gli appunti
- Funziona con input fino a 170 inclusi, input più alti producono un loop infinito, perché il loro fattoriale produce il
Infinity
numero (tecnicamente parlando, è una proprietà non scrivibile, non enumerabile e non configurabile dell'oggetto finestra).
- La precisione viene persa per gli input da 19 in poi, poiché i numeri superiori a 2 53 (= 9 007 199 254 740 992) non possono essere memorizzati con precisione in JavaScript.
Spiegazione
Questo programma è composto da due loop. Il primo calcola il fattoriale dell'input, l'altro divide il risultato nelle sue cifre e somma quelle insieme. Quindi viene stampata la somma e il programma termina.
Inizio
Innanzitutto, dobbiamo preparare la pila. Per quella parte, usiamo le prime tre istruzioni. L'IP inizia sulla quarta riga, puntando verso est. Lo stack è vuoto.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Manterremo la somma in fondo allo stack, quindi dobbiamo iniziare con l' 0
essere la somma memorizzandola sul fondo dello stack. Quindi dobbiamo premere a1
, perché l'input verrà inizialmente moltiplicato per il numero prima di esso. Se questo fosse zero, anche il fattoriale produrrebbe sempre zero. Infine leggiamo l'input come un numero intero.
Ora, lo stack è [0, 1, input]
e l'IP è alla quarta riga, la quarta colonna, che punta verso est.
Ciclo fattoriale
Questo è un semplice ciclo che moltiplica i primi due elementi dello stack (il risultato del ciclo precedente e l'input - n, quindi decrementa l'input. Si interrompe quando l'ingresso raggiunge 0. L' $
istruzione fa sì che l'IP salti il u
- Il ciclo è la parte seguente del cubo L'IP inizia sulla quarta riga, quarta colonna.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
A causa del ^
personaggio, l'IP inizia immediatamente a spostarsi a nord. Quindi u
gira l'IP e lo sposta di uno a destra. In fondo, c'è un'altra freccia: <
punta l'IP nuovamente in ^
. Lo stack inizia come [previousresult, input-n]
, dov'è n
il numero di iterazioni. I seguenti caratteri vengono eseguiti nel loop:
*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]
Quindi la parte superiore della pila (diminuzione ingresso) viene confrontato 0
dal !
istruzione, e se è 0
il u
carattere è saltato.
Somma le cifre
L'IP si avvolge attorno al cubo, finendo sull'ultimo carattere sulla quarta riga, inizialmente rivolto verso ovest. Il ciclo seguente è composto praticamente da tutti i caratteri rimanenti:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Il ciclo elimina prima l'elemento in cima alla pila (che è o 10
o 0
), quindi controlla ciò che resta del risultato del fattoriale. Se è stato ridotto a 0
, viene stampato il fondo della pila (la somma) e il programma si arresta. Altrimenti, vengono eseguite le seguenti istruzioni (lo stack inizia come [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]
E il ciclo ricomincia, fino a quando non è factorial/10
uguale a 0.
n>21