语境
Straw Poll是一个用于创建简单/非正式民意测验的网站。带有选项列表,用户可以选择他们的选项,并计票。稻草投票有两个非常重要的功能:
- 投票前可以查看当前结果
- 通常可以选择多个选项,就像您多次投票一样,每个选项一个。
比进行Straw Polls更有趣的一件事是弄乱结果。干扰有两种主要类型:
- 简单破坏,您可以对所有选项进行投票
- 高级中断,您可以从中战略性地选择要投票的选项,以最大程度地发挥效果。
在这个挑战中,您将编写一个高级中断程序。
数学
简单地说,可以说选票的熵值越高,民意测验的干扰就越大。 这意味着一个选项拥有所有票数的民意测验根本不会受到干扰,而每个选项具有相等票数的民意测验将被最大程度地破坏(这是最终目标)。
数字列表的熵[x1, x2, ..., xn]由维基百科的以下方程式给出。P(xi)是的概率xi,即xi / total_num_of_votes。如果到目前为止,一个选项的票数为零,那么它就不会包括在总和中(以避免log(0))。对我们而言,对数可以是您选择的任意基数。
举例[3,2,1,1]来说1.277,使用底数e的熵约为。
下一步是确定哪种投票模式会导致熵的最大增加。我可以为选项的任何子集投票,例如,我的投票可以是[1,0,1,0]。如果这些是我的选票,那么最后的计数是[4,2,2,1]。重新计算熵可得出1.273,熵降低,这意味着这是一次可怕的破坏尝试。以下是一些其他选项:
don't vote
[3,2,1,1] -> 1.277
vote for everything
[4,3,2,2] -> 1.342
vote for the 1s
[3,2,2,2] -> 1.369
vote for the 2 and 1s
[3,3,2,2] -> 1.366
由此可以得出结论,最优投票模式是[0,0,1,1]因为它可以最大程度地增加熵。
输入项
输入是一个非空的,非递增,非负整数的列表。示例包括[3,3,2,1,0,0],[123,23,1]甚至[4]。任何合理的格式都是允许的。
输出量
输出是真值和假值的列表(与输入长度相同),其中,真值表示如果我希望引起最大干扰的情况下应该投票的选项。如果多个投票模式给出相同的熵,则可以输出任何一个。
获奖标准
这是代码高尔夫球,字节越少越好。
测试用例
[3,2,1,1] -> [0,0,1,1] (from 1.227 to 1.369)
[3,3,2,1,0,0] -> [0,0,0,1,1,1] (from 1.311 to 1.705)
[123,23,1] -> [0,1,1] (from 0.473 to 0.510)
[4] -> [0] OR [1] (from 0 to 0)
[7,7,6,6,5] -> [0,0,1,1,1] (from 1.602 to 1.608)
[100,50,1,1] -> [0,1,1,1] (from 0.707 to 0.761)
