Simula un'elezione di deflusso istantanea


15

Sono le elezioni! L'area in cui ci troviamo implementa il sistema di voto chiamato deflusso istantaneo (a volte chiamato voto alternativo o voto preferenziale ). Ogni elettore ordina a ciascun candidato dal più preferito al meno preferito, segnando un "1" per il proprio candidato preferito, un "2" per il secondo candidato e così via fino a quando ciascun candidato non è numerato. Lascerò che questo simpatico koala spieghi il resto:

voto preferenziale

(Immagine modificata dall'originale di Patrick Alexander , utilizzata sotto la licenza CC BY-NC-SA 3.0 AU ).

Se preferisci la tua spiegazione del deflusso istantaneo in forma di testo, c'è anche l' articolo di Wikipedia .

(Nota: è anche possibile, sebbene improbabile, che ci siano due o più candidati con il minor numero di voti. In queste situazioni, scegline uno a caso a pari probabilità ed eliminali.)

In questa sfida, la prima riga di input è un elenco di stringhe, che sono i nomi dei candidati per le elezioni. In questi esempi ho usato valori delimitati da pipe, anche se sentiti libero di adattare il formato di input in base alla tua lingua.

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

Successivamente ci sono nlinee di input che sono anche elenchi di stringhe, ognuna delle quali rappresenta un singolo voto. La prima voce rappresenta quella preferenza numero 1, la successiva la preferenza numero 2, ecc. Ad esempio:

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

significherebbe che quel particolare voto ha Alexander come prima preferenza, Semolina Sorcerer come secondo, Tau Not Two come terzo, ecc. Puoi presumere che ogni voto conterrà tutti i candidati e che non ci saranno voti vuoti o incompleti.

Dati i voti come input, il tuo programma o funzione dovrebbe quindi generare il vincitore delle elezioni. Puoi trovare un'implementazione di riferimento non golfata in Python 3 qui .

Ingressi e uscite di esempio

Ingresso

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

Produzione

Alexander the Awesome

Ingresso

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

Produzione

Sighted Citruso Frosty Fox(a caso)

Ingresso

È possibile ottenere l'ultimo set di input qui . È una delle aree di voto di una recente elezione australiana ed è composta da 63 428 voti.

Produzione

Ross HART

1
Dobbiamo prendere la prima riga o possiamo dedurla dal resto dell'input?
Maltysen

@Maltysen Puoi omettere la prima riga se vuoi, anche se per favore prendine nota nella tua presentazione.
assenzio

1
@absinthe - il set di voto australiano non c'è più, ne hai una copia da qualche parte?
pixma140,

Risposte:


3

Pyth - 30 byte

Rifatterà. Deriva la prima riga dal resto dell'input.

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Test Suite .


1

R , 101 99 byte

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

Provalo online!

Prende input come matrice, con ogni colonna che rappresenta le scelte di un elettore. Lavora per ricorsione: trova un candidato con un numero minimo di voti, elimina tutte le voci corrispondenti nella matrice, riformatta la matrice e ricorre fino a quando la matrice ha solo 1 riga.

I voti ad ogni iterazione vengono calcolati contando con tablei valori nella riga superiore, che sono le scelte principali correnti di ciascun elettore. Questo viene mischiato sampleper rompere i legami a caso.

n<-dim(m)-1fornisce un vettore di lunghezza 2, ma viene utilizzato solo il primo valore (quindi è equivalente, ma 1 byte più corto di, n<-nrow(m)-1). Questo valore viene utilizzato due volte: prima viene confrontato con 0 per verificare se è stata raggiunta l'ultima iterazione; secondo, se ricerchiamo, è il numero di righe della nuova matrice.


0

Python 2 , 209 byte

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*

Provalo online!

Accetta input come un elenco di elenchi di preferenze degli elettori (la riga di intestazione non è inclusa). La randomizzazione in caso di pareggio è irritante!


0

Perl 5 -plF\| , 155 byte

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

Provalo online!


0

Python 2 , 200 byte

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)

Provalo online!

Utilizza l'ID oggetto dell'array come fonte di "casualità".
Basato sulla risposta di Chas Brown - Non ho abbastanza rappresentante per commentare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.