对秸秆民意测验造成最大破坏


9

语境

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)

我想知道如果我们想减少熵会发生什么。
CalculatorFeline

1
测试用例似乎与启发式“增加低于平均值”相一致。您能提供一些棘手的测试用例吗?
xnor

@xnor鉴于熵以均匀分布最大化,这将是一个很好的启发式方法!实际上,它甚至可能始终是最佳策略。也许有人可以想到一个好的案例?
西蒙斯(Simons)

Answers:


3

Mathematica,19个 44字节

...(大声抱怨)

(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&

测试:

{Test, data, goes, here};
(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&
%%+Boole/@%

{100,50,1,1}它返回的位置失败{False, False, True, True},导致熵为0.758{False, True, True, True}产生的熵0.761
IPoiler '16

@IPoiler感谢您找到该测试用例。
PhiNotPi

1
(哭泣和死亡)
CalculatorFeline

2
每此处应将其删除。
Rɪᴋᴇʀ

1
..固定。(抱怨更大声)
CalculatorFeline


1

MATL,24字节

FTinZ^tG+!ts/tYl*s4#X<Y)

这适用于语言/编译器的13.0.0版本,该版本早于挑战。

在线尝试!

说明

FT        % array [0 1]
in        % take input and push its length
Z^        % Cartesian power. This gives all possible vote patterns, each on a row
t         % duplicate (will be indexed into at the end to produce the result)
G         % push input again
+         % element-wise addition with broadcast
!         % transpose
ts/       % duplicate. Divide each column by its sum
tYl       % duplicatte. Take natural logarithm
*         % element-wise multiplication
s         % sum of each column. Gives minus entropy produce by each vote pattern
4#X<      % arg max
Y)        % index into original array of voting patterns. Implicitly display

这是一个工作原理的例子。对于输入[3 2 2],可能的投票模式数组(由产生Z^)为

[ 0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1 ]

每行都是一个模式。这将[3 2 0]通过广播(G+)添加到原始文件中。这意味着垂直[3 2 0]复制8时间,然后逐个添加

[ 3 2 2
  3 2 3
  3 3 2
  3 3 3
  4 2 2
  4 2 3
  4 3 2
  4 3 3 ]

这是转置的,每一列都除以每个和(!ts/):

[ 0.4286    0.3750    0.3750    0.3333    0.5000    0.4444    0.4444    0.4000
  0.2857    0.2500    0.3750    0.3333    0.2500    0.2222    0.3333    0.3000
  0.2857    0.3750    0.2500    0.3333    0.2500    0.3333    0.2222    0.3000 ]

乘以其对数并将各列(tYl*s)相加得出的熵减:

[ -1.0790   -1.0822   -1.0822   -1.0986   -1.0397   -1.0609   -1.0609   -1.0889 ]

负熵4#X<通过4th投票模式最小化(),其对应于(Y)最终结果[0 1 1]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.