Cubix, 24 19 Bytes
)uO)ABq-!wpUp)W.@;;
Hinweis
- Zählt tatsächlich, wie viele der gleichen Zeichen am Ende der Eingabe stehen. Dies funktioniert also auch für sehr große Ganzzahlen und sehr lange Zeichenfolgen (sofern die Anzahl der gleichen Zeichen am Ende kleiner ist als die maximale Genauigkeit von JavaScript). etwa 15 Stellen in der Basis 10).
- Die Eingabe erfolgt in das Eingabefeld, die Ausgabe wird in das Ausgabefeld gedruckt
Probieren Sie es hier aus
Erläuterung
Erweitern wir zunächst den Cube
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Die Schritte in der Ausführung können in drei Phasen unterteilt werden:
- Eingaben analysieren
- Zeichen vergleichen
- Ergebnis drucken
Phase 1: Eingabe
Die ersten beiden Zeichen, die ausgeführt werden, sind A
und B
. A
Liest alle Eingaben und schiebt sie als Zeichencodes auf den Stapel. Beachten Sie, dass dies in umgekehrter Reihenfolge erfolgt. Das erste Zeichen landet oben auf dem Stapel, das letzte Zeichen fast unten. Ganz unten steht -1
( EOF
), das als Zähler für die Anzahl aufeinanderfolgender Zeichen am Ende der Zeichenfolge verwendet wird. Da der obere Teil des Stapels die letzten beiden Zeichen enthalten muss, kehren wir den Stapel um, bevor wir in die Schleife eintreten. Beachten Sie, dass der obere Teil des Stapels sieht nun so: ..., C[n-1], C[n], -1
.
Die IP-Adresse auf dem Cube befindet sich dort, wo sie sich E
befindet, und sie zeigt nach rechts. Alle Anweisungen, die noch nicht ausgeführt wurden, wurden durch No-Ops (Punkt) ersetzt.
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Phase 2: Charaktervergleich
Der Stapel ist ..., C[a-1], C[a], counter
, wobei counter
die Zähler zu inkrementieren , wenn die zwei Zeichen (zu überprüfen C[a]
und C[a-1]
) gleich sind. Die IP tritt zuerst an der Stelle in diese Schleife ein S
und bewegt sich nach rechts. Das E
Zeichen ist die Position , wo die IP wird am Ende (nach rechts) , wenn C[a]
und C[a-1]
haben nicht den gleichen Wert, was bedeutet , dass Subtrahieren C[a]
von C[a-1]
nicht nachgibt 0
, in welchem Fall der Befehl die folgenden !
wird übersprungen (die eine w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Hier sind die Anweisungen, die während einer vollständigen Schleife ausgeführt werden:
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)
Und dann dreht es sich.
Phase 3: Druckergebnis
Da wir die Schleife vorzeitig verlassen, wie der Stapel sieht folgendermaßen aus : counter, ..., C[a-1]-C[a]
. Es ist einfach, den Zähler auszudrucken, aber wir müssen den Zähler einmal inkrementieren, weil wir ihn in der letzten Iteration der Schleife nicht ausgeführt haben, und noch einmal, weil wir -1
stattdessen mit dem Zählen begonnen haben 0
. Der Pfad auf dem Würfel sieht wie folgt aus: Er beginnt bei S
und zeigt nach rechts. Die beiden No-Ops, die von der IP ausgeführt werden, werden durch Pfeile ersetzt, die in Richtung der IP zeigen.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Die Anweisungen werden in der folgenden Reihenfolge ausgeführt. Beachten Sie, dass die B)
Anweisungen am Ende den Stapel ändern, das Programm jedoch nicht beeinflussen, da wir kurz davor stehen, ihn zu beenden, und den Stapel nicht mehr verwenden.
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.