Моделюйте миттєві вибори стоку


15

Це вибори! Територія, в якій ми перебуваємо, реалізує систему голосування, яку називають миттєвим сносом (іноді називають альтернативним голосуванням або пільговим голосуванням ). Кожен виборець наказує кожному кандидату від найбільш кращого для найменш кращого, позначаючи «1» для свого найбільш кращого кандидата, «2» для свого другого кандидата і так далі, поки кожен кандидат не буде пронумерований. Я дозволю цій дружній коалі пояснити решту:

пільгове голосування

(Зображення редагувався оригінал від Патріка Олександра , використовується під CC BY-NC-SA 3.0 ліцензії AU ).

Якщо ви віддаєте перевагу своє миттєве пояснення стоку у текстовій формі, є також стаття у Вікіпедії .

(Примітка. Також можливо, хоча й малоймовірно, щоб було два чи більше кандидатів, що мають найменше голосів. У цих ситуаціях вибирайте одного з них випадковим чином з однаковою ймовірністю та ліквідуйте їх.)

У цьому виклику перший рядок введення - це список рядків, у яких є імена кандидатів на вибори. У цих прикладах я використовував значення, розміщені в трубі, хоча сміливо налаштовуйте формат введення відповідно до вашої мови.

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

означало б, що саме цей голос має Олександр, як перший, Маклу Колдун як другий, Тау Не Два як їх третій і т. д. Можна припустити, що кожен голос буде містити кожного кандидата, і що не буде чистих чи неповних голосів.

Враховуючи голоси як вхідні дані, ваша програма чи функція повинні вивести переможця виборів. Ви можете знайти нереалізовану довідкову реалізацію в 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 Citrusабо Frosty Fox(випадковим чином)

Вхідні дані

Ви можете отримати останній набір вхідних тут . Це один із районів голосування останніх виборів в Австралії і складається з 63 428 голосів.

Вихідні дані

Ross HART

1
Чи потрібно брати перший рядок, чи ми можемо зробити це з іншого введення?
Мальтісен

@Maltysen Ви можете пропустити перший рядок, якщо хочете, хоча, будь ласка, занотуйте його у своєму поданні.
абсент

1
@absinthe - австралійського набору для голосування більше немає, у вас є його копія де-небудь?
pixma140

Відповіді:



1

R , 101 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 , 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

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)

Спробуйте в Інтернеті!

Використовує ідентифікатор об'єкта масиву як джерело "випадковості".
На підставі відповіді Часа Брауна - мені не вистачає респондентів, щоб коментувати!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.