Cubix, 24 19 bytes
)uO)ABq-!wpUp)W.@;;
Nota
- Na verdade, conta quantos dos mesmos caracteres existem no final da entrada, portanto, isso também funciona para números inteiros muito grandes e cadeias muito longas (desde que a quantidade de caracteres no final seja menor que a precisão máxima do JavaScript ( cerca de 15 dígitos na base 10).
- A entrada entra no campo de entrada, a saída é impressa no campo de saída
Experimente aqui
Explicação
Primeiro, vamos expandir o cubo
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
As etapas da execução podem ser divididas em três fases:
- Analisar entrada
- Compare caracteres
- Imprimir resultado
Fase 1: Entrada
Os dois primeiros caracteres que são executados são A
e B
. A
lê todas as entradas e as envia como códigos de caracteres para a pilha. Observe que isso é feito ao contrário, o primeiro caractere termina no topo da pilha, o último caractere quase na parte inferior. Na parte inferior, é colocado -1
( EOF
), que será usado como um contador para a quantidade de caracteres consecutivos no final da string. Como precisamos que o topo da pilha contenha os dois últimos caracteres, invertemos a pilha antes de inserir o loop. Observe que a parte superior da pilha agora se parece com:..., C[n-1], C[n], -1
.
O lugar do IP no cubo é onde E
está e está apontando para a direita. Todas as instruções que ainda não foram executadas foram substituídas por no-ops (pontos finais).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Fase 2: Comparação de caracteres
A pilha é ..., C[a-1], C[a], counter
onde counter
está o contador para incrementar quando os dois caracteres para verificar ( C[a]
e C[a-1]
) são iguais. O IP primeiro entra nesse loop no S
personagem, movendo-se para a direita. O E
caractere é a posição em que o IP terminará (apontando para a direita) quando C[a]
e C[a-1]
não terá o mesmo valor, o que significa que subtrair C[a]
de C[a-1]
não produz 0
, nesse caso a instrução a seguir !
será ignorada (que é a w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Aqui estão as instruções que são executadas durante um loop 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)
E então ele volta.
Fase 3: resultado da impressão
Desde que deixou o circuito cedo, os olhares pilha assim: counter, ..., C[a-1]-C[a]
. É fácil imprimir o contador, mas precisamos incrementá-lo uma vez porque não o fizemos na última iteração do loop e mais uma vez porque começamos a contar em -1
vez de 0
. O caminho no cubo se parece com isso, começando em S
, apontando para a direita. As duas operações não executadas pelo IP são substituídas por setas que apontam na direção do IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
As instruções são executadas na seguinte ordem. Observe que as B)
instruções no final alteram a pilha, mas não afetam o programa, pois estamos prestes a finalizá-la e não usamos mais a pilha.
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.