Cubix, 33 32 Bytes
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Netzform:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Probieren Sie es online!
Anmerkungen
- Arbeitet mit Eingaben bis einschließlich 170, führen höhere Eingaben zu einer Endlosschleife, da ihre Fakultät die
Infinity
Zahl ergibt (technisch gesehen eine nicht beschreibbare, nicht aufzählbare und nicht konfigurierbare Eigenschaft des Fensterobjekts).
- Bei Eingaben ab 19 geht die Genauigkeit verloren, da Zahlen über 2 53 (= 9 007 199 254 740 992) in JavaScript nicht genau gespeichert werden können.
Erläuterung
Dieses Programm besteht aus zwei Schleifen. Der erste berechnet die Fakultät der Eingabe, der andere teilt das Ergebnis in seine Ziffern auf und addiert diese. Dann wird die Summe gedruckt und das Programm beendet.
Start
Zuerst müssen wir den Stapel vorbereiten. Für diesen Teil verwenden wir die ersten drei Anweisungen. Die IP beginnt in der vierten Zeile und zeigt nach Osten. Der Stapel ist leer.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Wir behalten die Summe ganz unten im Stapel, also müssen wir 0
als Summe beginnen, indem wir diese auf der Unterseite des Stapels speichern. Dann müssen wir a drücken 1
, da die Eingabe zunächst mit der Zahl davor multipliziert wird. Wenn dies Null wäre, würde die Fakultät immer auch Null ergeben. Zuletzt lesen wir die Eingabe als Ganzzahl.
Jetzt ist der Stapel [0, 1, input]
und die IP ist in der vierten Zeile, der vierten Spalte, und zeigt nach Osten.
Fakultätsschleife
Dies ist eine einfache Schleife , dass multipliziert die obere beiden Elemente des Stapels (das Ergebnisses der vorherigen Schleife und der Eingangs - n, und dann dekrementiert den Eingang Es bricht , wenn der Eingang erreicht 0. Der. $
Befehl die bewirkt , dass die IP -überspringen u
- turn. Die Schleife ist der folgende Teil des Cubes: Die IP beginnt in der vierten Zeile, der vierten Spalte.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Aufgrund des ^
Charakters bewegt sich die IP sofort nach Norden. Dann u
dreht der die IP um und verschiebt sie nach rechts. Unten befindet sich ein weiterer Pfeil: <
Richtet die IP zurück in die ^
. Der Stapel beginnt wie folgt [previousresult, input-n]
: Wo n
ist die Anzahl der Iterationen? Die folgenden Zeichen werden in der Schleife ausgeführt:
*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]
Dann wird die Oberseite des Stapels (verringerte Eingabe) 0
durch die !
Anweisung überprüft , und wenn dies 0
der u
Fall ist , wird das Zeichen übersprungen.
Summiere die Ziffern
Die IP-Adresse wird um den Würfel gewickelt und endet beim letzten Zeichen in der vierten Zeile, das anfänglich nach Westen zeigt. Die folgende Schleife besteht aus so ziemlich allen verbleibenden Zeichen:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Die Schleife löscht zuerst das oberste Element aus dem Stapel (entweder 10
oder 0
) und prüft dann, was vom Ergebnis der Fakultät übrig bleibt. Wenn dies auf verringert wurde, 0
wird der Boden des Stapels (die Summe) gedruckt und das Programm angehalten. Andernfalls werden die folgenden Anweisungen ausgeführt (Stack startet als [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]
Und die Schleife beginnt erneut, bis factorial/10
0 ist.
n>21