0
またはを生成するコインがあります1
。しかし、コインは偏っている可能性があると思われます。つまり、0
(または1
)の確率は必ずしも1/2ではありません。
フォン・ノイマンによって提案された、偏ったコインを公正なコインに「変換」する(すなわち、同等の結果を得る)ためのよく知られた手順は次のとおりです。ブロックの2つの値が異なるまで、2つのコイントスの(重複しない)ブロックを生成します。そのブロックの最初の値を出力します(2番目の値でも同様ですが、この課題のために最初のものを選択します)。直感的には、よりも高い可能性がありますが、同様に可能性があります。1
0
01
10
たとえば、入力1110...
は最初のブロックを破棄1
し、2番目のブロックからa を生成します...
単一の結果を生成するために複数のコイントスが消費されるため、この手順は高価です。
チャレンジ
元のコインのトスを表すゼロと1の有限シーケンスを取り、すべての入力が消費されるまで、上記の手順に従って最大数の結果を生成します。
入力値の数が奇数の場合、最後のブロックは不完全な場合があります。たとえば、入力シーケンス11111
は結果を生成しません(最初の2つのブロックの値は等しく、3番目のブロックは不完全です)。
ルール
入力は、負または負の数の値を持つことができ、必ずしも正または偶数である必要はありません。
入力形式は次のとおりです。
- ゼロと1の配列。
- オプションの区切り文字を含むゼロと1の文字列。
出力形式は次のとおりです。
- セパレーターの有無にかかわらず、ゼロと1のストリング。
- ゼロと1の配列。
- 改行で区切られた単一のゼロまたは1を含む文字列。
- あなたの言語に合った同様の合理的なフォーマット。
コードゴルフ。最少バイトが勝ちます。
テストケース
ここでは、入力と出力は文字列であると想定されています。
Input --> Output
'1110' --> '1'
'11000110' --> '01'
'1100011' --> '0'
'00' --> ''
'1' --> ''
'' --> ''
'1101001' --> '0'
'1011101010' --> '1111'