Cubix, 24 19 байт
)uO)ABq-!wpUp)W.@;;
Заметка
- Фактически подсчитывает, сколько одинаковых символов находится в конце ввода, так что это работает и для действительно больших целых чисел, и для действительно длинных строк (при условии, что количество одинаковых символов в конце меньше максимальной точности JavaScript ( около 15 цифр в базе-10).
- Ввод идет в поле ввода, вывод выводится в поле вывода
Попробуй здесь
объяснение
Во-первых, давайте расширим куб
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Этапы выполнения могут быть разделены на три этапа:
- Разбор ввода
- Сравнить персонажей
- Распечатать результат
Этап 1: Ввод
Первые два символа, которые выполняются, A
и B
. A
читает все вводимые данные и помещает их в виде кодов символов в стек. Обратите внимание, что это делается в обратном порядке, первый символ заканчивается сверху стека, последний символ почти внизу. В самом низу находится -1
( EOF
), который будет использоваться в качестве счетчика для количества последовательных символов в конце строки. Так как нам нужно, чтобы верхняя часть стека содержала последние два символа, мы обращаемся к стеку перед входом в цикл. Обратите внимание , что верхняя часть стека теперь выглядит следующим образом : ..., C[n-1], C[n], -1
.
Место IP на кубе находится там, где оно E
есть, и оно указывает вправо. Все инструкции, которые еще не были выполнены, были заменены на no-ops (полные остановки).
. .
. .
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
направления вправо. Два no-ops, которые выполняются 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.