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, вказуючи праворуч. Два нерегульовані опції, які виконуються 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.