Имитация мгновенных выборов

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
@ Maltysen Вы можете опустить первую строку, если хотите, хотя, пожалуйста, отметьте это в своем представлении.
абсент
1
@absinthe - австралийского комплекта для голосования больше нет, у вас есть где-нибудь его копия?
pixma140

Ответы:

3

Pyth - 30 байт

Будет рефакторинг это. Выводит первую строку из оставшейся части ввода.

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Тестовый пакет .

Maltysen
источник
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)

Попробуйте онлайн!

Использует идентификатор объекта массива в качестве источника «случайности».
Основано на ответе Chas Brown - у меня недостаточно репутации, чтобы комментировать!

Фин Варман
источник