즉석 결선 선거 시뮬레이션


15

선거입니다! 우리가있는 지역은 즉석 투표라고 불리는 투표 시스템 ( 대체 투표 또는 우선 투표 라고도 함 )을 구현합니다. 각 유권자는 각 후보가 가장 선호되는 것부터 가장 덜 선호되는 것까지 순서를 정하고, 가장 선호하는 후보자는 "1", 두 번째 후보자는 "2"등으로 표시합니다. 이 친절한 코알라가 나머지를 설명하도록하겠습니다.

우선 투표

( CC BY-NC-SA 3.0 AU 라이센스에 따라 사용 된 Patrick Alexander에 의해 원본 에서 수정 된 이미지 ).

텍스트 형식의 즉석 결선 설명을 선호하는 경우 Wikipedia article도 있습니다.

(참고 : 가능성이 낮지 만 투표가 가장 적은 후보가 두 명 이상있을 수도 있습니다. 이러한 상황에서는 확률이 같은 확률로 무작위 중 하나를 선택하여 제거하십시오.)

이 챌린지에서 첫 번째 입력 라인은 선거 후보의 이름 인 문자열 목록입니다. 이 예제에서는 파이프 구분 값을 사용했지만 언어에 맞게 입력 형식을 자유롭게 조정할 수 있습니다.

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

이는 특정 투표가 Alexander를 첫 번째로 선호하고 Semolina Sorcerer를 두 번째로, Tau Not Two를 세 번째로 등을 의미합니다.

투표가 입력으로 주어지면 프로그램이나 기능이 선거의 승자를 출력해야합니다. 파이썬 3에서 ungolfed 참조 구현을 찾을 수 있습니다 here .

입력 및 출력 예

입력

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 원할 경우 첫 번째 줄을 생략 할 수 있지만 제출시이를 적어 두십시오.
absinthe

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

온라인으로 사용해보십시오!

각 열이 한 유권자의 선택을 나타내는 행렬로 입력을받습니다. 재귀에 의한 작동 : 최소 투표 수를 가진 후보를 찾고, 행렬에서 해당하는 모든 항목을 삭제하고, 행렬을 다시 포맷하고, 행렬에 행이 하나만있을 때까지 되풀이합니다.

각 반복에서의 투표 table는 각 투표자의 현재 최고 선택 인 맨 위 행의 값 으로 계산하여 계산됩니다 . 이것은 sample무작위로 관계를 끊기 위해 섞여 있습니다.

n<-dim(m)-1는 길이가 2 인 벡터를 제공하지만 첫 번째 값만 사용됩니다 (따라서 동등하지만 1 바이트보다 짧음 n<-nrow(m)-1). 이 값은 두 번 사용됩니다. 먼저 마지막 반복에 도달했는지 확인하기 위해 0과 비교됩니다. 둘째, 우리가 되풀이하면 새 행렬의 행 수입니다.


0

파이썬 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*

온라인으로 사용해보십시오!

유권자 우선 순위 목록의 목록으로 입력을받습니다 (헤더 행은 포함되지 않음). 넥타이의 경우 무작위 배정은 까다 롭습니다!



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.