Cubix、24 19バイト
)uO)ABq-!wpUp)W.@;;
注意
- 入力の最後に同じ文字がいくつあるかを実際に数えるので、これは本当に大きな整数と本当に長い文字列に対しても機能します(最後の同じ文字の量がJavaScriptの最大精度よりも小さい場合( 10進数で約15桁)。
- 入力は入力フィールドに入り、出力は出力フィールドに出力されます
ここで試してみてください
説明
まず、キューブを展開しましょう
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
実行のステップは、3つのフェーズに分割できます。
- 入力を解析する
- 文字を比較する
- 印刷結果
フェーズ1:入力
実行された最初の2つの文字があるA
とB
。A
すべての入力を読み取り、文字コードとしてスタックにプッシュします。これは逆に行われ、最初の文字がスタックの一番上になり、最後の文字がほぼ一番下になることに注意してください。一番下に、-1
(EOF
)が配置されます。これは、文字列の末尾にある連続した文字の量のカウンターとして使用されます。スタックの一番上に最後の2文字を含める必要があるため、ループに入る前にスタックを逆にします。スタックの上部は次のようになります..., C[n-1], C[n], -1
。
キューブ上のIPの場所は、その場所であり、E
右を向いています。まだ実行されていないすべての命令は、ノーオペレーション(フルストップ)に置き換えられました。
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
フェーズ2:文字の比較
スタックはです..., C[a-1], C[a], counter
。ここcounter
で、チェックする2つの文字(C[a]
およびC[a-1]
)が等しい場合に増分するカウンターです。IPは最初にS
キャラクターでこのループに入り、右に移動します。E
文字は、IP(右向き)してしまう位置であるC[a]
とC[a-1]
差し引くことを意味同じ値、持っていないC[a]
からC[a-1]
得られない0
命令は、以下その場合に、!
(あるスキップされますw
)。
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
完全なループ中に実行される命令は次のとおりです。
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)
そして、ループします。
フェーズ3:結果の印刷
ループを早期に終了したため、スタックは次のようになりますcounter, ..., C[a-1]-C[a]
。これは、カウンターを印刷するのは簡単ですが、我々は我々がでカウントを開始したので、我々はもう一度、ループの最後の繰り返しでそれを行う、としなかったため、いったんカウンタをインクリメントしなければならない-1
代わりに0
。キューブのパスは、から始まりS
、右を指すこのようになります。IPによって実行される2つのno-opは、IPの方向を指す矢印に置き換えられます。
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
命令は次の順序で実行されます。B)
最後の命令はスタックを変更しますが、プログラムを終了しようとしているため、プログラムには影響を与えず、スタックを使用しないことに注意してください。
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
アレア・イクタ