Cubix, 24 19 bayt
)uO)ABq-!wpUp)W.@;;
Not
- Aslında girişin sonunda aynı karakterlerin kaç tanesinin olduğunu sayar, bu nedenle bu gerçekten büyük tam sayılar ve gerçekten uzun karakter dizileri için de geçerlidir (sonunda aynı karakterlerin sayısı JavaScript'in maksimum hassasiyetinden küçük olduğu sürece ( 10 tabanındaki yaklaşık 15 hane).
- Giriş, giriş alanına giriyor, çıkış, çıkış alanına basılıyor
Burada dene
açıklama
İlk önce, küpü genişletelim
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Uygulamadaki adımlar üç aşamada ayrılabilir:
- Ayrıştırma girişi
- Karakterleri karşılaştır
- Sonucu yazdır
Faz 1: Giriş
Gerçekleştirilen ilk iki karakter A
ve B
. A
tüm girişi okur ve karakter kodları olarak yığına iter. Bunun tersten yapıldığına dikkat edin, ilk karakter yığının en üstünde, en son da neredeyse en altta biter. En altta, dizgenin sonundaki ardışık karakterlerin miktarı için bir sayaç olarak kullanılacak olan -1
( EOF
) yerleştirilir. Son iki karakteri içermesi için yığının tepesine ihtiyacımız olduğundan, döngüye girmeden önce yığını tersine çeviririz. Yığının en üst kısmının artık şöyle göründüğünü unutmayın:..., C[n-1], C[n], -1
.
IP'nin küp üzerindeki yeri, E
olduğu yer ve doğru olduğunu gösteriyor. Henüz uygulanmayan tüm talimatlar no-op'larla değiştirildi (tam durak).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Faz 2: Karakter karşılaştırması
Yığın, kontrol edilecek ( ve ) iki karakterin eşit ..., C[a-1], C[a], counter
olduğu durumlarda counter
artma sayacının olduğu yerdir . IP ilk önce bu döngüye karakterden girerek sağa ilerler. Karakter IP (hakkı işaret) sona erecek pozisyonudur ve aynı değeri çıkarılarak bu araçlara sahip olmayan dan verim vermez , bu durumda aşağıdaki talimatı de atlanır (bir olan ).C[a]
C[a-1]
S
E
C[a]
C[a-1]
C[a]
C[a-1]
0
!
w
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Tam bir döngü sırasında yürütülen talimatlar:
q-!;;p) # Explanation
q # Push counter to the bottom of the stack
# Stack (counter, ..., C[a-1], C[a])
- # Subtract C[a] from C[a-1], which is 0 if both are equal
# Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
! # Leave the loop if C[a-1]-C[a] does not equal 0
;; # Remove result of subtraction and C[a] from stack
# Stack (counter, ..., C[a-1])
p # Move the bottom of the stack to the top
# Stack (..., C[a-1], counter)
) # Increment the counter
# Stack (..., C[a-1], counter + 1)
Ve sonra etrafında dolaşıyor.
Faz 3: Baskı sonucu
Erken döngü ayrıldığından beri, yığın görünüyor bu gibi: counter, ..., C[a-1]-C[a]
. Bu sayaç yazdırmak için kolay, ama biz de saymayı başladık çünkü biz döngünün son tekrarında bunu ve bir kez daha çünkü bir kez sayacını artırmak zorunda -1
yerine 0
. Küp üzerindeki yol, S
sağdan işaret ederek başlayarak bu şekilde görünür . IP tarafından yürütülen iki no-op, IP yönünü gösteren oklarla değiştirilir.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Talimatlar aşağıdaki sırayla gerçekleştirilir. B)
Sonunda verilen talimatların yığını değiştirdiğini ancak programı sonlandırmayacağımızdan, programı sonlandırmayacağımıza ve yığını kullanmayacağımıza dikkat edin.
p))OB)@ # Explanation
p # Pull the counter to the top
# Stack: (..., counter)
)) # Add two
# Stack: (..., counter + 2)
O # Output as number
B) # Reverse the stack and increment the top
@ # End the program
Alea iacta est.