Khối, 24 19 byte
)uO)ABq-!wpUp)W.@;;
chú thích
- Trên thực tế, có bao nhiêu ký tự giống nhau ở cuối đầu vào, do đó, nó hoạt động cho các số nguyên thực sự lớn và các chuỗi thực sự dài (miễn là số lượng các ký tự giống nhau ở cuối nhỏ hơn độ chính xác tối đa của JavaScript ( khoảng 15 chữ số trong cơ sở-10).
- Đầu vào đi vào trường đầu vào, đầu ra được in ra trường đầu ra
Hãy thử nó ở đây
Giải trình
Đầu tiên, hãy mở rộng khối
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Các bước trong quá trình thực hiện có thể được chia thành ba giai đoạn:
- Phân tích cú pháp
- So sánh các nhân vật
- Kết quả in
Giai đoạn 1: Đầu vào
Hai ký tự đầu tiên được thực thi là A
và B
. A
đọc tất cả đầu vào và đẩy nó dưới dạng mã ký tự vào ngăn xếp. Lưu ý rằng điều này được thực hiện ngược lại, ký tự đầu tiên kết thúc ở trên cùng của ngăn xếp, ký tự cuối cùng gần như ở dưới cùng. Ở dưới cùng, -1
( EOF
) được đặt, sẽ được sử dụng làm bộ đếm cho số lượng ký tự liên tiếp ở cuối chuỗi. Vì chúng ta cần đỉnh của ngăn xếp để chứa hai ký tự cuối cùng, chúng tôi đảo ngược ngăn xếp, trước khi vào vòng lặp. Lưu ý rằng phần trên cùng của ngăn xếp bây giờ trông như sau:..., C[n-1], C[n], -1
.
Vị trí của IP trên khối lập phương là vị trí E
và nó đang chỉ đúng. Tất cả các hướng dẫn chưa được thực hiện, đã được thay thế bằng no-op (dừng hoàn toàn).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Giai đoạn 2: So sánh nhân vật
Ngăn xếp là ..., C[a-1], C[a], counter
, nơi counter
bộ đếm tăng dần khi hai ký tự kiểm tra ( C[a]
và C[a-1]
) bằng nhau. IP đầu tiên vào vòng lặp này tại S
ký tự, di chuyển sang phải. Các E
nhân vật là vị trí nơi mà các IP sẽ kết thúc (chỉ phải) khi C[a]
và C[a-1]
không có giá trị như nhau, có nghĩa là trừ đi C[a]
từ C[a-1]
không mang lại 0
, trong trường hợp các hướng dẫn sau đó !
sẽ bị bỏ qua (mà là một w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Dưới đây là các hướng dẫn được thực hiện trong một vòng lặp đầy đủ:
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)
Và sau đó nó vòng quanh.
Giai đoạn 3: Kết quả in
Vì chúng tôi rời vòng lặp sớm, ngăn xếp trông như thế này : counter, ..., C[a-1]-C[a]
. Thật dễ dàng để in bộ đếm, nhưng chúng tôi phải tăng bộ đếm một lần vì chúng tôi đã không làm điều đó trong lần lặp cuối cùng của vòng lặp và một lần nữa vì chúng tôi bắt đầu đếm -1
thay vì 0
. Đường dẫn trên khối lập phương trông như thế này, bắt đầu từ S
, chỉ sang phải. Hai no-op được thực thi bởi IP được thay thế bằng các mũi tên chỉ theo hướng của IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Các hướng dẫn được thực hiện theo thứ tự sau đây. Lưu ý rằng các B)
hướng dẫn ở cuối thay đổi ngăn xếp, nhưng không ảnh hưởng đến chương trình, vì chúng tôi sắp chấm dứt nó và chúng tôi không sử dụng ngăn xếp nữa.
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.