Anında bir ikinci tur seçim simülasyonu


15

Seçim bu! İçinde bulunduğumuz alan anlık akış denilen oylama sistemini uygular (bazen alternatif oylama veya tercihli oylama olarak da adlandırılır ). Her seçmen, her adayı en çok tercih edilenlerden en az tercih edilenlere, en çok tercih edilen adayları için "1", ikinci adayları için "2" ve her adayın numaralandırılıncaya kadar işaretler. Bu dost koala'nın geri kalanını açıklamasına izin vereceğim:

tercihli oylama

( CC BY-NC-SA 3.0 AU lisansı altında kullanılan Patrick Alexander tarafından orijinalden değiştirilmiş resim ).

Anlık akış açıklamanızı metin biçiminde tercih ederseniz, Wikipedia makalesi de vardır .

(Not: Nadiren de olsa, en az oyu olan iki veya daha fazla adayın olması da mümkündür. Bu durumlarda, bunlardan birini eşit olasılıklarda rastgele seçin ve ortadan kaldırın.)

Bu meydan okumada, ilk girdi satırı, seçim için adayların adları olan dizelerin bir listesidir. Bu örneklerde, giriş sınırını dilinize uyacak şekilde ayarlamaktan çekinmeyin, ancak boru sınırlandırılmış değerleri kullandım.

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

Aşağıda n, her biri tek bir oylamayı temsil eden dizeler listesi olan girdi satırları yer almaktadır. İlk giriş # 1 tercihi, diğeri # 2 tercihi vb. Oyları temsil eder. Örneğin:

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

belirli bir oylamanın ilk tercihi İskender, ikincisi ise Semolina Büyücü, üçüncüsü Tau Not Two, vb.

Oylar girdi olarak verildiğinde, programınız veya işleviniz seçimin galibi olacaktır. Burada Python 3'te çözülmemiş bir referans uygulaması bulabilirsiniz .

Örnek Girişler ve Çıkışlar

Giriş

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

Çıktı

Alexander the Awesome

Giriş

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

Çıktı

Sighted Citrusveya Frosty Fox(rastgele)

Giriş

Ayarlanan son girişi buradan alabilirsiniz . Son Avustralya seçimlerinin oy alanlarından biri ve 63 428 oydan oluşuyor.

Çıktı

Ross HART

1
İlk satırı mı almalıyız yoksa girişin geri kalanından çıkarabilir miyiz?
Maltysen

@Maltysen İsterseniz ilk satırı atlayabilirsiniz, ancak lütfen gönderiminizde not edin.
Absinthe

1
@absinthe - Avustralya oylama seti artık orada değil, herhangi bir yerinde bir kopyanız var mı?
pixma140

Yanıtlar:


3

Pyth - 30 bayt

Refactor olacak. İlk satırı girişin geri kalanından alır.

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Test Takımı .


1

R , 101 99 bayt

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

Çevrimiçi deneyin!

Bir matris olarak girdi alır, her sütun bir seçmenin seçimlerini temsil eder. Özyineleme ile çalışır: en az oyu olan bir aday bulun, matristeki karşılık gelen tüm girişleri silin, matrisi yeniden biçimlendirin ve matris sadece 1 sıra olana kadar tekrarlayın.

Her bir yinelemedeki oylar, tableher seçmenin geçerli en iyi seçenekleri olan üst sıradaki değerlerle sayılarak hesaplanır . Bu, samplerastgele bağları koparmak için karıştırılır .

n<-dim(m)-12 uzunluğunda bir vektör verir, ancak sadece ilk değer kullanılır (bu yüzden eşdeğerdir, ancak 1 bayttan daha kısadır n<-nrow(m)-1). Bu değer iki kez kullanılır: ilk olarak son yinelemeye ulaşılıp ulaşılmadığını kontrol etmek için 0 ile karşılaştırılır; ikincisi, eğer dersi alırsak, yeni matrisin satır sayısıdır.


0

Python 2 , 209 bayt

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*

Çevrimiçi deneyin!

Seçmeni seçmenlerin listelerinin listesi olarak alır (başlık satırı dahil değildir). Beraberlik durumunda rastgeleleştirme can sıkıcıdır!


0

Perl 5 -plF\| , 155 bayt

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

Çevrimiçi deneyin!


0

Python 2 , 200 bayt

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)

Çevrimiçi deneyin!

Dizinin nesne kimliğini 'rasgelelik' kaynağı olarak kullanır.
Kapalı göre Chas Brown'ın Yanıt - Ben yorumuna yeterince temsilcisi yok!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.