您有一枚可产生0
或的硬币1
。但是您怀疑硬币可能有偏差,这意味着0
(或1
)的概率不一定是1/2。
由冯·诺伊曼(von Neumann)提出的一种众所周知的将“有偏见的硬币”“转化”为公平硬币的过程(即获得同样可能的结果)如下。产生(不重叠)两个掷硬币的区块,直到一个区块的两个值不同为止;并在该块中输出第一个值(第二个值也可以,但是出于挑战的目的,我们选择第一个)。直观地看,1
可能比更容易0
,但01
和10
将同样有可能。
例如,输入1110...
将丢弃第一个块,然后1
从第二个块产生a ,...
此过程很昂贵,因为要消耗多个硬币才能产生单个结果。
挑战
取零和一的有限序列(代表原始硬币的抛弃),并根据上述过程产生最大数量的结果,直到消耗完所有输入为止。
如果输入值的数量为奇数,则最后一个块可能不完整。例如,输入序列11111
将不产生结果(前两个块具有相等的值,而第三个块不完整)。
规则
输入可以具有任意数量的非负值,不一定是正数或偶数。
输入格式可以是:
- 零和一的数组;
- 一串零和一,并带有可选的分隔符。
输出格式可能是:
- 一串零和一,带或不带分隔符;
- 零和一的数组;
- 包含单个零或一的字符串,以换行符分隔;
- 适合您的语言的任何相似,合理的格式。
代码高尔夫。最少的字节数获胜。
测试用例
这里假定输入和输出为字符串。
Input --> Output
'1110' --> '1'
'11000110' --> '01'
'1100011' --> '0'
'00' --> ''
'1' --> ''
'' --> ''
'1101001' --> '0'
'1011101010' --> '1111'