Cubix, 24 19 byte
)uO)ABq-!wpUp)W.@;;
Catatan
- Sebenarnya menghitung berapa banyak karakter yang sama di akhir input, jadi ini berfungsi untuk bilangan bulat yang sangat besar dan string yang sangat panjang juga (selama jumlah karakter yang sama di akhir lebih kecil dari presisi maksimum JavaScript ( sekitar 15 digit pada basis-10).
- Input masuk dalam bidang input, output dicetak ke bidang output
Coba di sini
Penjelasan
Pertama, mari kita perluas kubus
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Langkah-langkah dalam eksekusi dapat dibagi menjadi tiga fase:
- Masukan parse
- Bandingkan karakter
- Hasil cetak
Fase 1: Input
Dua karakter pertama yang dieksekusi adalah A
dan B
. A
membaca semua input dan mendorongnya sebagai kode karakter ke stack. Perhatikan bahwa ini dilakukan secara terbalik, karakter pertama berakhir di atas tumpukan, karakter terakhir hampir di bagian bawah. Di bagian paling bawah, -1
( EOF
) ditempatkan, yang akan digunakan sebagai penghitung untuk jumlah karakter berturut-turut di akhir string. Karena kita membutuhkan bagian atas tumpukan untuk memuat dua karakter terakhir, kita membalik tumpukan, sebelum memasuki loop. Perhatikan bahwa bagian atas tumpukan sekarang terlihat seperti:..., C[n-1], C[n], -1
.
Tempat IP pada kubus adalah di mana tempatnya E
, dan itu menunjuk ke kanan. Semua instruksi yang belum dieksekusi, digantikan oleh no-ops (berhenti penuh).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Fase 2: Perbandingan karakter
Tumpukannya adalah ..., C[a-1], C[a], counter
, di mana counter
penghitung yang akan bertambah ketika kedua karakter yang diperiksa ( C[a]
dan C[a-1]
) sama. IP pertama kali memasuki loop ini pada S
karakter, bergerak ke kanan. The E
karakter adalah posisi di mana IP akan berakhir (menunjuk kanan) saat C[a]
dan C[a-1]
tidak memiliki nilai yang sama, yang berarti bahwa mengurangkan C[a]
dari C[a-1]
tidak menghasilkan 0
, dalam hal instruksi berikut !
akan dilewati (yang merupakan w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Berikut adalah instruksi yang dijalankan selama satu lingkaran penuh:
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)
Dan kemudian ia berputar.
Fase 3: Hasil cetak
Sejak kita meninggalkan loop awal, tumpukan terlihat seperti ini: counter, ..., C[a-1]-C[a]
. Sangat mudah untuk mencetak penghitung, tetapi kita harus menambah penghitung sekali karena kita tidak melakukannya di iterasi terakhir dari loop, dan sekali lagi karena kita mulai menghitung -1
bukan 0
. Jalan di kubus terlihat seperti ini, mulai dari S
, menunjuk ke kanan. Dua no-ops yang dijalankan oleh IP digantikan oleh panah yang mengarah ke IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Instruksi dieksekusi dalam urutan berikut. Perhatikan bahwa B)
petunjuk pada akhirnya mengubah tumpukan, tetapi tidak memengaruhi program, karena kami akan menghentikannya, dan kami tidak menggunakan tumpukan itu lagi.
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.