Cubix, 33 32 байти
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Чиста форма:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Спробуйте в Інтернеті!
Примітки
- Робота з входами до і включаючи 170, більш високі входи призводять до нескінченного циклу, тому що їх фабрика дає
Infinity
кількість (технічно кажучи, це незаписувана, не перелічувана і не конфігурувана властивість віконного об'єкта).
- Точність для входів 19 і вище втрачається, тому що числа, які перевищують 2 53 (= 9 007 199 254 740 992), не можуть бути точно збережені в JavaScript.
Пояснення
Ця програма складається з двох циклів. Перший обчислює коефіцієнт введення, другий розбиває результат на його цифри і додає їх разом. Потім сума друкується, і програма закінчується.
Старт
Спочатку нам потрібно підготувати стек. Для цієї частини ми використовуємо перші три вказівки. ІС починається з четвертої лінії, вказуючи на схід. Стек порожній.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Ми збережемо суму в самому нижній частині стека, тому нам потрібно почати з 0
суми, зберігаючи її в нижній частині стека. Тоді нам потрібно натиснути a 1
, тому що вхід спочатку буде помножений на число перед ним. Якби це дорівнювало нулю, факториал завжди також давав би нуль. Нарешті ми читаємо введення як ціле число.
Тепер стек є, [0, 1, input]
і IP знаходиться на четвертому рядку, четвертому стовпчику, вказує на схід.
Факторна петля
Це простий цикл, який примножує два верхні елементи елемента стека (результат попереднього циклу та введення - n, а потім зменшує вхід. Він руйнується, коли вхід досягне 0. $
Інструкція змушує IP пропустити u
- петля - це наступна частина куба. IP починається з четвертого рядка, четвертого стовпця.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Через ^
характер, IP починає рухатися на північ негайно. Потім u
обертає IP навколо і переміщує його вправо. Внизу є ще одна стрілка: <
вказує IP назад у ^
. Стек починається як [previousresult, input-n]
, де n
кількість ітерацій. У циклі виконуються наступні символи:
*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]
Потім у верхній частині стеки (зменшився введення) звіряються 0
з !
інструкції, і якщо вона 0
, то u
персонаж буде пропущений.
Підсумуйте цифри
IP обертається навколо куба, закінчуючи останнім символом на четвертому рядку, спочатку вказуючи на захід. Наступний цикл складається майже з усіх символів, що залишилися:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Цикл спочатку видаляє верхній елемент із стека (який є 10
або 0
), а потім перевіряє, що залишилося від результату факториуму. Якщо це було зменшено до 0
, друкується нижня частина стека (сума) і програма зупиняється. В іншому випадку виконуються такі інструкції (стек починається як [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]
І цикл починається знову, factorial/10
дорівнює 0.
n>21