Cubix, 33 32 bajty
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Formularz netto:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Wypróbuj online!
Notatki
- Działa z danymi wejściowymi do 170 włącznie, co powoduje powstanie nieskończonej pętli, ponieważ ich silnia daje
Infinity
liczbę (technicznie rzecz biorąc, jest to nie do zapisania, nie do wyliczenia i nie do skonfigurowania właściwość obiektu okna).
- Dokładność jest tracona dla danych wejściowych 19 i wyższych, ponieważ liczb wyższych niż 2 53 (= 9 007 199 254 740 992) nie można dokładnie zapisać w JavaScript.
Wyjaśnienie
Ten program składa się z dwóch pętli. Pierwszy oblicza silnię danych wejściowych, drugi dzieli wynik na cyfry i dodaje je do siebie. Następnie suma jest drukowana i program kończy się.
Początek
Najpierw musimy przygotować stos. W tej części wykorzystujemy pierwsze trzy instrukcje. IP zaczyna się na czwartej linii, wskazując na wschód. Stos jest pusty.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Będziemy trzymać sumę na samym dole stosu, więc musimy zacząć od 0
bycia sumą, przechowując ją na dole stosu. Następnie musimy nacisnąć a 1
, ponieważ dane wejściowe zostaną początkowo pomnożone przez liczbę przed nim. Gdyby było to zero, silnia również zawsze dawałaby zero. Na koniec odczytujemy dane wejściowe jako liczbę całkowitą.
Teraz stos jest, [0, 1, input]
a adres IP znajduje się w czwartej linii, czwartej kolumnie, skierowanej na wschód.
Pętla czynnikowa
Jest to prosta pętla, która zwielokrotnia dwa górne elementy stosu (wynik poprzedniej pętli i danych wejściowych - n, a następnie zmniejsza dane wejściowe. Łamie się, gdy dane wejściowe osiągną 0. $
Instrukcja powoduje, że IP pomija u
- turn Pętla jest następującą częścią sześcianu: IP zaczyna się od czwartej linii, czwartej kolumny.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Z powodu tej ^
postaci IP natychmiast zaczyna się poruszać na północ. Następnie u
odwraca adres IP i przesuwa go jeden w prawo. Na dole znajduje się kolejna strzałka: <
wskazuje adres IP z powrotem na ^
. Stos zaczyna się od [previousresult, input-n]
, gdzie, gdzie n
jest liczba iteracji. W pętli wykonywane są następujące znaki:
*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]
Następnie górna część stosu (zmniejszone wejście) jest sprawdzana 0
przez !
instrukcję, a jeśli tak 0
, u
znak jest pomijany.
Zsumuj cyfry
IP otacza sześcian, kończąc na ostatnim znaku w czwartej linii, początkowo wskazując na zachód. Następująca pętla składa się z prawie wszystkich pozostałych znaków:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Pętla najpierw usuwa element górny ze stosu (który jest albo 10
albo 0
), a następnie sprawdza, co jest na lewo od wyniku silni. Jeśli to zostało zmniejszone 0
, drukowane jest dno stosu (suma) i program zatrzymuje się. W przeciwnym razie zostaną wykonane następujące instrukcje (stos zaczyna się jako [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]
Pętla zaczyna się od nowa, aż do factorial/10
zera.
n>21