Simuler une élection de ruissellement instantanée

15

C'est l'élection! Le domaine dans lequel nous nous trouvons met en œuvre le système de vote appelé ruissellement instantané (parfois appelé vote alternatif ou vote préférentiel ). Chaque électeur classe chaque candidat du plus préféré au moins préféré, marquant un "1" pour son candidat le plus préféré, un "2" pour son deuxième candidat, et ainsi de suite jusqu'à ce que chaque candidat soit numéroté. Je vais laisser ce sympathique koala expliquer le reste:

vote préférentiel

(Image modifiée de l' original par Patrick Alexander , utilisée sous la licence CC BY-NC-SA 3.0 AU ).

Si vous préférez votre explication du ruissellement instantané sous forme de texte, il y a aussi l'article Wikipedia .

(Remarque: il est également possible, bien que peu probable, qu'il y ait deux candidats ou plus avec le moins de votes. Dans ces situations, choisissez l'un d'eux au hasard à probabilités égales et éliminez-les.)

Dans ce défi, la première ligne d'entrée est une liste de chaînes, qui sont les noms des candidats à l'élection. Dans ces exemples, j'ai utilisé des valeurs délimitées par des tuyaux, mais n'hésitez pas à ajuster le format d'entrée en fonction de votre langue.

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

Ensuite, il y a des nlignes d'entrée qui sont également des listes de chaînes, chacune représentant un seul vote. La première entrée représente la préférence n ° 1, la suivante la préférence n ° 2, etc. Par exemple:

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

cela signifierait que ce vote particulier a Alexander comme première préférence, Semolina Sorcerer comme deuxième, Tau Not Two comme troisième, etc. Vous pouvez supposer que chaque vote contiendra chaque candidat et qu'il n'y aura pas de votes blancs ou incomplets.

Compte tenu des votes en entrée, votre programme ou votre fonction devrait ensuite générer le vainqueur de l'élection. Vous pouvez trouver une implémentation de référence non golfée dans Python 3 ici .

Exemples d'entrées et de sorties

Contribution

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

Production

Alexander the Awesome

Contribution

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

Production

Sighted Citrusou Frosty Fox(au hasard)

Contribution

Vous pouvez obtenir la dernière entrée définie ici . Il s'agit de l'un des domaines de vote d'une récente élection australienne et compte 63 428 voix.

Production

Ross HART
Absinthe
la source
1
Devons-nous prendre la première ligne, ou pouvons-nous la déduire du reste de l'entrée?
Maltysen
@Maltysen Vous pouvez omettre la première ligne si vous le souhaitez, mais veuillez en prendre note dans votre soumission.
absinthe
1
@absinthe - le kit de vote australien n'est plus là, en avez-vous une copie quelque part?
pixma140

Réponses:

3

Pyth - 30 octets

Je vais le refactoriser. Déduit la première ligne du reste de l'entrée.

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Suite de tests .

Maltysen
la source
1

R , 101 99 octets

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

Essayez-le en ligne!

Prend les données sous forme de matrice, chaque colonne représentant les choix d'un électeur. Fonctionne par récursivité: trouvez un candidat avec un nombre minimal de votes, supprimez toutes les entrées correspondantes dans la matrice, reformatez la matrice et répétez jusqu'à ce que la matrice ne comporte qu'une seule ligne.

Les votes à chaque itération sont calculés en comptant avec tableles valeurs de la ligne du haut, qui sont les meilleurs choix actuels de chaque électeur. Ceci est mélangé samplepour rompre les liens au hasard.

n<-dim(m)-1donne un vecteur de longueur 2, mais seule la première valeur est utilisée (donc elle est équivalente, mais 1 octet plus court que, n<-nrow(m)-1). Cette valeur est utilisée deux fois: d'abord elle est comparée à 0 pour vérifier si la dernière itération a été atteinte; deuxièmement, si nous recursons, c'est le nombre de lignes de la nouvelle matrice.

Robin Ryder
la source
0

Python 2 , 209 octets

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*

Essayez-le en ligne!

Prend la saisie comme une liste de listes de préférences électorales (la ligne d'en-tête n'est pas incluse). La randomisation en cas d'égalité est vexante!

Chas Brown
la source
0

Perl 5 -plF\| , 155 octets

%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}

Essayez-le en ligne!

Xcali
la source
0

Python 2 , 200 octets

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)

Essayez-le en ligne!

Utilise l'ID d'objet du tableau comme source de «caractère aléatoire».
Basé sur la réponse de Chas Brown - Je n'ai pas assez de représentants pour commenter!

Fin Warman
la source