Cubix, 24 19 bajtów
)uO)ABq-!wpUp)W.@;;
Uwaga
- Faktycznie liczy, ile takich samych znaków znajduje się na końcu danych wejściowych, więc działa to również w przypadku naprawdę dużych liczb całkowitych i naprawdę długich ciągów znaków (o ile liczba takich samych znaków na końcu jest mniejsza niż maksymalna precyzja JavaScript ( około 15 cyfr w bazie-10).
- Dane wejściowe trafiają do pola wejściowego, dane wyjściowe są drukowane do pola wyjściowego
Wypróbuj tutaj
Wyjaśnienie
Najpierw rozwińmy kostkę
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
Kroki wykonania można podzielić na trzy fazy:
- Analizuj dane wejściowe
- Porównaj postacie
- Wydrukuj wynik
Faza 1: Wejście
Pierwsze dwa znaki, które są wykonywane, to A
i B
. A
odczytuje wszystkie dane wejściowe i wypycha je jako kody znaków na stos. Zauważ, że odbywa się to w odwrotnej kolejności, pierwsza postać kończy się na stosie, a ostatnia prawie na dole. Na samym dole znajduje się -1
( EOF
), który będzie używany jako licznik ilości kolejnych znaków na końcu ciągu. Ponieważ potrzebujemy, aby góra stosu zawierała dwa ostatnie znaki, odwracamy stos przed wejściem do pętli. Zauważ, że górna część stosu wygląda teraz:..., C[n-1], C[n], -1
.
Miejsce IP na kostce jest tam, gdzie E
jest i wskazuje w prawo. Wszystkie instrukcje, które nie zostały jeszcze wykonane, zostały zastąpione przez brak operacji (kropki).
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
Faza 2: Porównanie postaci
Stos to ..., C[a-1], C[a], counter
, gdzie counter
jest licznik przyrostu, gdy dwa znaki do sprawdzenia ( C[a]
i C[a-1]
) są równe. IP najpierw wchodzi w tę pętlę przy S
znaku, przesuwając się w prawo. E
Postać jest stanowisko, gdzie IP skończy się (wskazując prawo), gdy C[a]
i C[a-1]
nie mają tę samą wartość, co oznacza, że odjęcie C[a]
od C[a-1]
nie daje 0
, w którym to przypadku instrukcji po !
zostanie pominięty (co jest w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
Oto instrukcje, które są wykonywane podczas pełnej pętli:
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)
A potem się zapętla.
Faza 3: wydrukuj wynik
Ponieważ opuścił pętlę wcześnie, wygląd stos słuszne: counter, ..., C[a-1]-C[a]
. Łatwo jest wydrukować licznik, ale musimy zwiększyć licznik raz, ponieważ nie zrobiliśmy tego w ostatniej iteracji pętli, i jeszcze raz, ponieważ -1
zamiast tego zaczęliśmy liczyć 0
. Ścieżka na kostce wygląda tak, zaczynając od S
, wskazując w prawo. Dwie operacje „no-op” wykonywane przez adres IP są zastępowane strzałkami wskazującymi w kierunku adresu IP.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
Instrukcje są wykonywane w następującej kolejności. Zauważ, że B)
instrukcje na końcu zmieniają stos, ale nie wpływają na program, ponieważ mamy zamiar go zakończyć i nie używamy już stosu.
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.