Cubix, 33 32 bayt
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
Net form:
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Çevrimiçi deneyin!
notlar
- 170'e kadar olan ve bunlara dahil olan girdilerle çalışır, daha yüksek girdiler sonsuz bir döngüye neden olur, çünkü faktörlü değerleri
Infinity
sayıyı (teknik olarak konuşulursa, pencere nesnesinin yazılabilir, numaralandırılamaz ve yapılandırılamaz bir özelliğidir).
- Girişler 19 ve üstü için doğruluk kaybedilir, çünkü 2 53'ten (= 9 007 199 254 740 992) daha yüksek sayılar JavaScript’te doğru şekilde saklanamaz.
açıklama
Bu program iki döngüden oluşmaktadır. Birincisi, girişin faktörünü hesaplar, diğeri sonucu rakamlara böler ve bunları birlikte ekler. Sonra toplam yazdırılır ve program sona erer.
başla
İlk önce yığını hazırlamamız gerekiyor. Bu kısım için ilk üç talimatı kullanıyoruz. IP, dördüncü çizgide başlar ve doğuya işaret eder. Yığın boş.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
Toplamı yığının en altında tutacağız, bu yüzden 0
toplamı yığının en altına depolayarak toplamamız gerekir. O zaman a tuşuna basmamız gerekiyor 1
, çünkü giriş başlangıçta ondan önceki sayı ile çarpılır. Eğer bu sıfır olsaydı, faktoring de her zaman sıfır verecekti. Son olarak girişi bir tamsayı olarak okuduk.
Şimdi, yığın [0, 1, input]
ve IP, dördüncü satırda, dördüncü sütunda, doğuya dönük.
Faktör döngüsü
Bu basit bir halka olduğu çarpar üst yığını (önceki döngü ve giriş sonucunda iki elemanları - n, ve daha sonra giriş azaltır giriş 0 ulaştığı zaman kırılır. $
Talimat atlamak için IP neden olur u
- Döngü küpün sonraki kısmıdır IP, dördüncü satırda, dördüncü sütunda başlar.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
^
Karakter nedeniyle IP hemen kuzeye doğru hareket etmeye başlar. Ardından u
IP döner ve bir tane sağa doğru hareket eder. Altta, başka bir ok var: <
IP'yi tekrar işaret ediyor ^
. Yığın , yineleme sayısının [previousresult, input-n]
olduğu gibi başlar n
. Aşağıdaki karakterler döngüde yürütülür:
*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]
Daha sonra yığın (azalma giriş) üst kontrol edilir 0
tarafından !
talimat, ve eğer 0
,u
karakter atlanır.
Rakamları topla
IP küpün etrafına sarılır ve dördüncü satırdaki en son karaktere başlar ve başlangıçta batıya bakar. Aşağıdaki döngü hemen hemen tüm kalan karakterlerden oluşur:
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
Döngü ilk olarak üst öğeyi yığından siler (ki ya 10
da ya da 0
) ve sonra faktörün sonucunun kalanını kontrol eder. Bu 0
azalmışsa, yığının altı (toplam) basılır ve program durur. Aksi takdirde, aşağıdaki talimatlar uygulanır (yığın olarak başlar [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]
Ve döngü factorial/10
0'a eşit olana kadar tekrar başlar .
n>21