Mensimulasikan pemilihan limpasan instan

15

Ini pemilihan! Area tempat kami menerapkan sistem pemungutan suara yang disebut limpasan instan (kadang-kadang disebut pemilihan alternatif atau pemilihan preferensial ). Setiap pemilih memerintahkan setiap kandidat dari yang paling disukai sampai yang paling tidak disukai, menandai "1" untuk kandidat yang paling disukai mereka, "2" untuk kandidat kedua mereka, dan seterusnya hingga setiap kandidat diberi nomor. Saya akan membiarkan koala yang ramah ini menjelaskan sisanya:

pemungutan suara preferensial

(Gambar dimodifikasi dari aslinya oleh Patrick Alexander , digunakan di bawah lisensi CC BY-NC-SA 3.0 AU ).

Jika Anda lebih suka penjelasan limpasan instan Anda dalam bentuk teks, ada juga artikel Wikipedia .

(Catatan: Ini juga mungkin, meskipun tidak mungkin, untuk ada dua atau lebih kandidat dengan suara terbanyak. Dalam situasi ini, pilih salah satu dari mereka secara acak pada probabilitas yang sama dan hilangkan mereka.)

Dalam tantangan ini, baris input pertama adalah daftar string, yang merupakan nama-nama kandidat untuk pemilihan. Dalam contoh-contoh ini saya telah menggunakan nilai batas pipa, meskipun merasa bebas untuk menyesuaikan format input yang sesuai dengan bahasa Anda.

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

Berikut ini adalah nbaris input yang juga daftar string, yang masing-masing mewakili satu suara. Entri pertama menyatakan bahwa preferensi # 1 suara, berikutnya preferensi # 2, dll. Misalnya:

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

akan berarti bahwa suara tertentu memiliki Alexander sebagai preferensi pertama mereka, Semolina Sorcerer sebagai yang kedua, Tau Bukan Dua sebagai yang ketiga, dll. Anda dapat mengasumsikan bahwa setiap suara akan berisi setiap kandidat, dan bahwa tidak akan ada suara yang kosong atau tidak lengkap.

Dengan memberikan suara sebagai input, program atau fungsi Anda kemudian akan menghasilkan pemenang pemilihan. Anda dapat menemukan implementasi referensi tak bertali di Python 3 di sini .

Contoh Input dan Output

Memasukkan

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

Keluaran

Alexander the Awesome

Memasukkan

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

Keluaran

Sighted Citrusatau Frosty Fox(secara acak)

Memasukkan

Anda bisa mendapatkan set input terakhir di sini . Ini adalah salah satu area pemungutan suara dari pemilihan Australia baru-baru ini, dan terdiri dari 63.428 suara.

Keluaran

Ross HART
Absinth
sumber
1
Apakah kita harus mengambil baris pertama, atau bisakah kita menyimpulkannya dari sisa input?
Maltysen
@Maltysen Anda dapat menghilangkan baris pertama jika Anda mau, meskipun harap membuat catatan di kiriman Anda.
absinthe
1
@absinthe - perangkat pemilihan Australia sudah tidak ada lagi, apakah Anda punya salinannya di mana saja?
pixma140

Jawaban:

3

Pyth - 30 byte

Akan refactor itu. Disimpulkan dari baris pertama dari sisa input.

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Test Suite .

Maltysen
sumber
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])

Cobalah online!

Mengambil input sebagai matriks, dengan setiap kolom mewakili pilihan satu pemilih. Bekerja dengan rekursi: temukan kandidat dengan jumlah suara minimal, hapus semua entri yang sesuai dalam matriks, format ulang matriks, dan rekur ulang hingga matriks hanya memiliki 1 baris.

Suara pada setiap iterasi dihitung dengan menghitung dengan tablenilai-nilai di baris atas, yang merupakan pilihan teratas saat ini dari setiap pemilih. Ini dikocok dengan sampleuntuk memutuskan ikatan secara acak.

n<-dim(m)-1memberikan vektor panjang 2, tetapi hanya nilai pertama yang digunakan (jadi itu setara, tetapi 1 byte lebih pendek dari, n<-nrow(m)-1). Nilai ini digunakan dua kali: pertama dibandingkan dengan 0 untuk memeriksa apakah iterasi terakhir telah tercapai; kedua, jika kita berulang, itu adalah jumlah baris dari matriks baru.

Robin Ryder
sumber
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*

Cobalah online!

Mengambil input sebagai daftar daftar preferensi pemilih (baris tajuk tidak termasuk). Pengacakan dalam kasus dasi menjengkelkan!

Chas Brown
sumber
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}

Cobalah online!

Xcali
sumber
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)

Cobalah online!

Memanfaatkan ID objek dari array sebagai sumber 'keacakan'.
Didasarkan atas Jawaban Chas Brown - Saya tidak punya cukup perwakilan untuk berkomentar!

Fin Warman
sumber