Cubix, 24 19 octets
)uO)ABq-!wpUp)W.@;;
Remarque
- Compte en fait combien de mêmes caractères se trouvent à la fin de l'entrée, donc cela fonctionne aussi pour les très grands entiers et les très longues chaînes (tant que la quantité de mêmes caractères à la fin est inférieure à la précision maximale de JavaScript ( environ 15 chiffres en base 10).
- L'entrée va dans le champ d'entrée, la sortie est imprimée dans le champ de sortie
Essayez-le ici
Explication
Tout d'abord, développons le cube
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Les étapes de l'exécution peuvent être divisées en trois phases:
- Entrée d'analyse
- Comparer les personnages
- Résultat d'impression
Phase 1: entrée
Les deux premiers caractères exécutés sont A
et B
. A
lit toutes les entrées et les envoie sous forme de codes de caractères à la pile. Notez que cela se fait à l'envers, le premier caractère se retrouve en haut de la pile, le dernier caractère presque en bas. Tout en bas, -1
( EOF
) est placé, qui sera utilisé comme compteur pour le nombre de caractères consécutifs à la fin de la chaîne. Puisque nous avons besoin que le haut de la pile contienne les deux derniers caractères, nous inversons la pile, avant d'entrer dans la boucle. Notez que la partie supérieure de la pile ressemble maintenant à:..., C[n-1], C[n], -1
.
La place de l'IP sur le cube est l'endroit où se E
trouve, et il pointe vers la droite. Toutes les instructions qui n'ont pas encore été exécutées ont été remplacées par des no-ops (arrêts complets).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Phase 2: Comparaison des personnages
La pile est ..., C[a-1], C[a], counter
, où counter
est le compteur à incrémenter lorsque les deux caractères à vérifier ( C[a]
et C[a-1]
) sont égaux. L'IP entre d'abord dans cette boucle au niveau du S
personnage, se déplaçant vers la droite. Le E
caractère est la position où l'IP finira (pointant vers la droite) quand C[a]
et n'aura C[a-1]
pas la même valeur, ce qui signifie que la soustraction C[a]
de C[a-1]
ne donnera pas 0
, auquel cas l'instruction suivant le !
sera sautée (qui est a w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Voici les instructions qui sont exécutées pendant une boucle complète:
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)
Et puis il tourne en boucle.
Phase 3: impression du résultat
Depuis que nous avons quitté la boucle au début, la pile ressemble à ceci: counter, ..., C[a-1]-C[a]
. Il est facile d'imprimer le compteur, mais nous devons l'incrémenter une fois parce que nous ne l'avons pas fait lors de la dernière itération de la boucle, et encore une fois parce que nous avons commencé à compter à la -1
place de 0
. Le chemin sur le cube ressemble à ceci, en commençant par S
, pointant vers la droite. Les deux no-op qui sont exécutés par l'IP sont remplacés par des flèches qui pointent dans la direction de l'IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Les instructions sont exécutées dans l'ordre suivant. Notez que les B)
instructions à la fin changent la pile, mais n'affectent pas le programme, car nous sommes sur le point de le terminer, et nous n'utilisons plus la pile.
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
Le sort en est jeté.