Cubix, 24 19 byte
)uO)ABq-!wpUp)W.@;;
Nota
- Conta effettivamente quanti caratteri uguali si trovano alla fine dell'input, quindi funziona per numeri molto grandi e stringhe molto lunghe (purché la quantità degli stessi caratteri alla fine sia inferiore alla massima precisione di JavaScript ( circa 15 cifre in base-10).
- L'input va nel campo di input, l'output viene stampato nel campo di output
Provalo qui
Spiegazione
Innanzitutto, espandiamo il cubo
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
I passaggi nell'esecuzione possono essere suddivisi in tre fasi:
- Input di analisi
- Confronta i personaggi
- Stampa il risultato
Fase 1: input
I primi due caratteri che vengono eseguiti sono A
e B
. A
legge tutti gli input e li inserisce come codici carattere nello stack. Nota che questo è fatto al contrario, il primo personaggio finisce in cima alla pila, l'ultimo personaggio quasi in fondo. In fondo, viene posizionato -1
( EOF
), che verrà utilizzato come contatore per la quantità di caratteri consecutivi alla fine della stringa. Poiché abbiamo bisogno che la parte superiore dello stack contenga gli ultimi due caratteri, invertiamo lo stack prima di entrare nel loop. Si noti che la parte superiore dello stack ora appare come segue: ..., C[n-1], C[n], -1
.
La posizione dell'IP sul cubo è dove si E
trova e sta puntando a destra. Tutte le istruzioni che non sono state ancora eseguite, sono state sostituite da no-op (stop completi).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Fase 2: confronto dei personaggi
Lo stack è ..., C[a-1], C[a], counter
, dove si counter
trova il contatore da incrementare quando i due caratteri da controllare ( C[a]
e C[a-1]
) sono uguali. L'IP entra per primo in questo loop sul S
personaggio, spostandosi a destra. Il E
carattere è la posizione in cui il PI finirà (punta destra) quando C[a]
e C[a-1]
non hanno lo stesso valore, il che significa che sottraendo C[a]
dal C[a-1]
non ancora fruttifera 0
, nel qual caso l'istruzione che segue l' !
verranno saltati (che è una w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Ecco le istruzioni che vengono eseguite 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)
E poi gira intorno.
Fase 3: stampare il risultato
Dal momento che abbiamo lasciato il ciclo precoce, gli sguardi di stack in questo modo: counter, ..., C[a-1]-C[a]
. È facile stampare il contatore, ma dobbiamo incrementare il contatore una volta perché non l'abbiamo fatto nell'ultima iterazione del ciclo e ancora una volta perché abbiamo iniziato a contare -1
invece di 0
. Il percorso sul cubo si presenta così, a partire da S
, puntando a destra. Le due no-op eseguite dall'IP vengono sostituite da frecce che puntano nella direzione dell'IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Le istruzioni vengono eseguite nel seguente ordine. Nota che le B)
istruzioni alla fine cambiano lo stack, ma non influenzano il programma, poiché stiamo per terminarlo e non utilizziamo più lo stack.
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
Il dado è tratto.