Cubix, 24 19 bytes
)uO)ABq-!wpUp)W.@;;
Nota
- En realidad, cuenta cuántos de los mismos caracteres hay al final de la entrada, por lo que esto también funciona para enteros realmente grandes y cadenas muy largas (siempre que la cantidad de los mismos caracteres al final sea menor que la precisión máxima de JavaScript ( alrededor de 15 dígitos en base-10).
- La entrada va en el campo de entrada, la salida se imprime en el campo de salida
Pruébalo aquí
Explicación
Primero, expandamos el cubo
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Los pasos en la ejecución se pueden dividir en tres fases:
- Analizar entrada
- Comparar personajes
- Imprimir resultado
Fase 1: entrada
Los dos primeros caracteres que se ejecutan son A
y B
. A
lee todas las entradas y las envía como códigos de caracteres a la pila. Tenga en cuenta que esto se hace a la inversa, el primer personaje termina en la parte superior de la pila, el último personaje casi en la parte inferior. En el fondo-1
EOF
se coloca ( ), que se utilizará como un contador para la cantidad de caracteres consecutivos al final de la cadena. Como necesitamos que la parte superior de la pila contenga los dos últimos caracteres, invertimos la pila antes de ingresar al bucle. Tenga en cuenta que la parte superior de la pila ahora se ve así: ..., C[n-1], C[n], -1
.
El lugar de la IP en el cubo es donde E
está, y apunta a la derecha. Todas las instrucciones que aún no se han ejecutado, fueron reemplazadas por no-ops (paradas completas).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Fase 2: Comparación de personajes
La pila es ..., C[a-1], C[a], counter
, donde counter
está el contador para aumentar cuando los dos caracteres para verificar ( C[a]
y C[a-1]
) son iguales. La IP primero ingresa a este bucle en el S
personaje, moviéndose hacia la derecha. El E
carácter es la posición en la que la IP terminará (apuntando a la derecha) cuando C[a]
y C[a-1]
no tenga el mismo valor, lo que significa que restar C[a]
de C[a-1]
no produce 0
, en cuyo caso !
se omitirá la instrucción que sigue a la (que es a w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Aquí están las instrucciones que se ejecutan durante un ciclo completo:
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)
Y luego da vueltas.
Fase 3: resultado de la impresión
Desde que salimos del bucle temprano, las miradas se encaja como esto: counter, ..., C[a-1]-C[a]
. Es fácil imprimir el contador, pero tenemos que incrementar el contador una vez porque no lo hicimos en la última iteración del ciclo, y una vez más porque comenzamos a contar en -1
lugar de 0
. El camino en el cubo se ve así, comenzando en S
, apuntando a la derecha. Los dos no-ops que son ejecutados por la IP son reemplazados por flechas que apuntan en la dirección de la IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Las instrucciones se ejecutan en el siguiente orden. Tenga en cuenta que las B)
instrucciones al final cambian la pila, pero no afectan el programa, ya que estamos a punto de terminarlo, y ya no usamos la pila.
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.