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.