Cubix,24个 19字节
)uO)ABq-!wpUp)W.@;;
注意
- 实际上会计算输入末尾有多少个相同字符,因此这对于很大的整数和非常长的字符串也适用(只要末尾相同字符的数量小于JavaScript的最大精度(以10为基数的15位数字左右)。
- 输入进入输入字段,输出打印到输出字段
在这里尝试
说明
首先,让我们扩展多维数据集
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
执行步骤可分为三个阶段:
- 解析输入
- 比较字符
- 打印结果
阶段1:输入
执行的前两个字符是A
和B
。A
读取所有输入并将其作为字符代码压入堆栈。请注意,这是相反的操作,第一个字符结束于堆栈的顶部,最后一个字符几乎位于底部。最底部放置-1
(EOF
),它将用作字符串末尾连续字符数量的计数器。由于我们需要堆栈的顶部包含最后两个字符,因此我们在进入循环之前反转堆栈。请注意,堆栈的顶部现在看起来像:..., C[n-1], C[n], -1
。
IP在多维数据集上的位置就是当前位置E
,并且指向正确的位置。所有尚未执行的指令均由无操作(句号)代替。
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
阶段2:字符比较
堆栈是..., C[a-1], C[a], counter
,其中counter
是要检查的两个字符(C[a]
和C[a-1]
)相等时要增加的计数器。IP首先在S
字符处进入此循环,向右移动。的E
字符是其中IP将结束(指向右侧)时的位置C[a]
和C[a-1]
不具有相同的值,这意味着减去C[a]
从C[a-1]
不能产生0
,在这种情况下,跟随该指令!
将被跳过(这是一个w
)。
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
以下是在完整循环中执行的指令:
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)
然后循环。
阶段3:打印结果
由于我们提早退出循环,因此堆栈看起来像这样:counter, ..., C[a-1]-C[a]
。打印计数器很容易,但由于在循环的最后一次迭代中未进行计数,因此我们不得不对计数器进行一次递增,而由于我们开始于-1
而不是进行计数,因此必须再次增加计数器0
。多维数据集上的路径看起来像这样,从处开始S
,指向右边。IP执行的两个无操作被指向IP方向的箭头替换。
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
这些指令按以下顺序执行。请注意,最后的B)
指令会更改堆栈,但不会影响程序,因为我们即将终止该程序,并且不再使用堆栈。
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。