Cubix, 33 32 byte
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Bentuk bersih:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Cobalah online!
Catatan
- Bekerja dengan input hingga dan termasuk 170, input yang lebih tinggi menghasilkan loop yang tak terbatas, karena faktorialnya menghasilkan
Infinity
angka (secara teknis, ini adalah properti objek jendela yang tidak dapat ditulis, tidak dapat dihitung, dan tidak dapat dikonfigurasi).
- Akurasi hilang untuk input 19 dan lebih tinggi, karena angka yang lebih tinggi dari 2 53 (= 9 007 199 254 740 992) tidak dapat disimpan secara akurat dalam JavaScript.
Penjelasan
Program ini terdiri dari dua loop. Yang pertama menghitung faktorial dari input, yang lain membagi hasilnya menjadi digit-nya dan menambahkannya menjadi satu. Kemudian jumlahnya dicetak, dan program selesai.
Mulai
Pertama, kita perlu menyiapkan tumpukan. Untuk bagian itu, kami menggunakan tiga instruksi pertama. IP dimulai pada baris keempat, menunjuk ke timur. Tumpukan kosong.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Kami akan menyimpan jumlah di bagian paling bawah tumpukan, jadi kita harus mulai dengan 0
menjadi jumlah dengan menyimpannya di bagian bawah tumpukan. Maka kita perlu mendorong a1
, karena input awalnya akan dikalikan dengan angka sebelumnya. Jika ini nol, faktorial akan selalu menghasilkan nol juga. Terakhir kita membaca input sebagai integer.
Sekarang, tumpukannya [0, 1, input]
dan IP berada di baris keempat, kolom keempat, menunjuk ke timur.
Lingkaran faktorial
Ini adalah loop sederhana yang mengalikan dua elemen teratas dari stack (hasil dari loop sebelumnya dan input - n, dan kemudian mengurangi input. Itu rusak ketika input mencapai 0. $
Instruksi menyebabkan IP untuk melewatkan u
- turn.Lop adalah bagian dari kubus berikut ini. IP dimulai pada baris keempat, kolom keempat.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Karena ^
karakternya, IP mulai bergerak ke utara segera. Kemudian u
berbalik IP dan bergerak satu ke kanan. Di bagian bawah, ada panah lain: <
mengarahkan IP kembali ke ^
. Tumpukan dimulai sebagai [previousresult, input-n]
, di mana n
jumlah iterasi. Karakter berikut dieksekusi dalam 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]
Kemudian bagian atas tumpukan (input berkurang) diperiksa 0
oleh !
instruksi, dan jika ya 0
, theu
karakter dilewati.
Jumlahkan angka
IP membungkus kubus, berakhir pada karakter terakhir pada baris keempat, awalnya menunjuk ke barat. Loop berikut terdiri dari hampir semua karakter yang tersisa:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Loop pertama-tama menghapus item teratas dari tumpukan (yang merupakan salah satu 10
atau 0
), dan kemudian memeriksa apa yang tersisa dari hasil faktorial. Jika itu telah dikurangi menjadi 0
, bagian bawah tumpukan (jumlahnya) dicetak dan program berhenti. Jika tidak, instruksi berikut dijalankan (tumpukan dimulai sebagai [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]
Dan loop dimulai lagi, hingga factorial/10
sama dengan 0.
n>21