模拟即时径流选举


15

这是选举!我们所在的区域实施称为即时径流的投票系统(有时称为替代投票优先投票)。每个投票者从最喜欢的到最不喜欢的顺序对每个候选人进行排序,为他们的最喜欢的候选人标记一个“ 1”,为他们的第二个候选人标记一个“ 2”,依此类推,直到为每个候选人编号。我让这个友好的考拉解释其余的事情:

优先投票

(图像从改性原始通过帕特里克亚历山大,所述下使用CC BY-NC-SA 3.0 AU许可)。

如果您更喜欢文本形式的即时径流解释,也可以参考Wikipedia文章

(注意:虽然可能不大,但也有可能有两个或两个以上投票最少的候选人。在这种情况下,请以相等的概率随机选择其中之一,并消除他们。)

在此挑战中,输入的第一行是字符串列表,这些字符串是选举候选人的名称。在这些示例中,尽管可以随意调整输入格式以适合您的语言,但我使用了管道分隔值。

The Omitted Anti-neutrino|Placazoa|Alexander the Awesome|Tau Not Two|Semolina Sorcerer

接下来是n输入行,也是行列表,每行代表一个表决。第一个条目表示投票#1优先,第二个投票#2,依此类推。例如:

Alexander the Awesome|Semolina Sorcerer|Tau Not Two|Placazoa|The Omitted Anti-neutrino

这意味着该特定投票将亚历山大作为第一优先级,将Semolina Sorcerer作为其第二优先级,将Tau Not Two作为其第三优先级,依此类推。您可以假设每个投票都将包含每个候选人,并且不会有空白或不完整的投票。

给定选票作为输入,您的程序或功能应随后输出选举的获胜者。您可以在此处找到Python 3中未引用的参考实现。

输入和输出示例

输入值

Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Portal Butter|Alexander the Awesome|Dionysius|Red Trainmen
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Portal Butter|Red Trainmen|Alexander the Awesome|Dionysius
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Alexander the Awesome|Red Trainmen|Portal Butter|Dionysius
Red Trainmen|Alexander the Awesome|Dionysius|Portal Butter
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Red Trainmen|Dionysius|Portal Butter|Alexander the Awesome
Alexander the Awesome|Dionysius|Red Trainmen|Portal Butter
Dionysius|Portal Butter|Alexander the Awesome|Red Trainmen
Alexander the Awesome|Red Trainmen|Dionysius|Portal Butter

输出量

Alexander the Awesome

输入值

Depressed Billy|Sighted Citrus|Frosty Fox|Electronic Accident
Frosty Fox|Sighted Citrus|Electronic Accident|Depressed Billy
Frosty Fox|Depressed Billy|Sighted Citrus|Electronic Accident
Depressed Billy|Electronic Accident|Sighted Citrus|Frosty Fox
Depressed Billy|Sighted Citrus|Electronic Accident|Frosty Fox
Depressed Billy|Electronic Accident|Sighted Citrus|Frosty Fox
Electronic Accident|Frosty Fox|Depressed Billy|Sighted Citrus
Sighted Citrus|Frosty Fox|Electronic Accident|Depressed Billy
Frosty Fox|Depressed Billy|Sighted Citrus|Electronic Accident
Sighted Citrus|Electronic Accident|Frosty Fox|Depressed Billy
Frosty Fox|Electronic Accident|Depressed Billy|Sighted Citrus
Sighted Citrus|Frosty Fox|Depressed Billy|Electronic Accident

输出量

Sighted CitrusFrosty Fox(随机)

输入值

你可以得到最后的输入设置在这里。它是最近澳大利亚大选的投票领域之一,由63 428票组成。

输出量

Ross HART

1
我们是否必须采用第一行,还是可以从其余输入中推断出第一行?
Maltysen'1

@Maltysen您可以根据需要省略第一行,尽管请在提交的内容中注明。
苦艾酒2017年

1
@absinthe-澳大利亚的表决集已经不存在了,您在任何地方都有它的副本吗?
pixma140

Answers:



1

R101 99字节

f=function(m)`if`(n<-dim(m)-1,f(matrix(m[m!=names(t<-sample(table(m[1,])))[which.min(t)]],n)),m[1])

在线尝试!

将输入作为矩阵,每列代表一个投票者的选择。递归工作:找到最少投票数的候选人,删除矩阵中的所有相应条目,重新格式化矩阵,然后递归直到矩阵只有1行。

每次迭代时的选票都是通过计算table第一行中的值来计算的,这些值是每个选民当前的最高选择。这与洗牌sample,打破随机联系。

n<-dim(m)-1给出长度为2的向量,但仅使用第一个值(因此它是等效的,但比短1个字节n<-nrow(m)-1)。该值使用了两次:首先将其与0进行比较,以检查是否已达到最后一次迭代;第二,如果我们递归,它是新矩阵的行数。


0

Python 2 2,209字节

def f(s):
 d={}
 for v in s:
	k=v[0];d[k]=d.get(k,[])+[v]
	if len(d[k])>len(s)/2:return k
 D=d.values()
 for v in choice([g for g in D if len(g)==len(min(D,key=len))]):v.pop(0)
 return f(s)
from random import*

在线尝试!

将输入作为选民偏爱列表的列表(不包括标题行)。如果打成平局,这种随机性令人烦恼!


0

Perl -plF\| 5,155个字节

%r?push@v,[@F]:map$r{$_}=1,@F}{while(@v/2>=$c{$\=pop@t}){map{shift@$_ while!$r{$$_[0]}}@v;%c=();map$c{$$_[0]}++,@v;$r{(@t=sort{$c{$a}-$c{$b}}keys%c)[0]}=0}

在线尝试!


0

Python 2,200字节

def f(s):
 d={}
 for v in s:
    k=v[0];d[k]=d.get(k,[])+[v]
    if len(d[k])>len(s)/2:return k
 D=d.values()
 x=[g for g in D if len(g)==len(min(D,key=len))]
 for v in x[id(x)%len(x)]:v.pop(0)
 return f(s)

在线尝试!

利用数组的对象ID作为“随机性”的来源。
基于Chas Brown的答案 -我没有足够的代表发表评论!

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.