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.