Mô phỏng một cuộc bầu cử ngay lập tức


15

Đó là cuộc bầu cử! Khu vực mà chúng tôi đang triển khai hệ thống bỏ phiếu được gọi là dòng chảy ngay lập tức (đôi khi được gọi là bỏ phiếu thay thế hoặc bỏ phiếu ưu đãi ). Mỗi cử tri yêu cầu mỗi ứng cử viên từ ưu tiên nhất đến ít ưu tiên nhất, đánh dấu "1" cho ứng cử viên ưa thích nhất của họ, "2" cho ứng cử viên thứ hai của họ, và cứ thế cho đến khi mỗi ứng cử viên được đánh số. Tôi sẽ để chú gấu túi thân thiện này giải thích phần còn lại:

bỏ phiếu ưu đãi

(Hình ảnh được sửa đổi từ bản gốc của Patrick Alexander , được sử dụng theo giấy phép CC BY-NC-SA 3.0 AU ).

Nếu bạn thích giải thích về dòng chảy ngay lập tức của mình ở dạng văn bản, thì cũng có bài viết Wikipedia .

(Lưu ý: Cũng có thể, mặc dù không có khả năng, vì có hai hoặc nhiều ứng cử viên có ít phiếu nhất. Trong những tình huống này, hãy chọn một trong số họ một cách ngẫu nhiên với xác suất bằng nhau và loại bỏ chúng.)

Trong thử thách này, dòng đầu tiên là một danh sách các chuỗi, là tên của các ứng cử viên cho cuộc bầu cử. Trong các ví dụ này, tôi đã sử dụng các giá trị được phân tách bằng đường ống, mặc dù có thể điều chỉnh định dạng đầu vào cho phù hợp với ngôn ngữ của bạn.

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

Theo sau đó là ncác dòng đầu vào cũng là danh sách các chuỗi, mỗi chuỗi đại diện cho một phiếu bầu duy nhất. Mục đầu tiên thể hiện rằng ưu tiên số 1, ưu tiên số 2 tiếp theo, v.v. Ví dụ:

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

sẽ có nghĩa là phiếu bầu cụ thể đó có Alexander là ưu tiên đầu tiên của họ, Semolina Sorcerer là người thứ hai của họ, Tau Not Two là người thứ ba của họ, v.v.

Với số phiếu là đầu vào, chương trình hoặc chức năng của bạn sẽ đưa ra người chiến thắng trong cuộc bầu cử. Bạn có thể tìm thấy một triển khai tham chiếu vô căn cứ trong Python 3 tại đây .

Ví dụ đầu vào và đầu ra

Đầu vào

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

Đầu ra

Alexander the Awesome

Đầu vào

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

Đầu ra

Sighted Citrushoặc Frosty Fox(ngẫu nhiên)

Đầu vào

Bạn có thể lấy bộ đầu vào cuối cùng ở đây . Đây là một trong những khu vực bỏ phiếu của một cuộc bầu cử gần đây của Úc và bao gồm 63 428 phiếu bầu.

Đầu ra

Ross HART

1
Chúng ta có phải lấy dòng đầu tiên, hoặc chúng ta có thể suy ra nó từ phần còn lại của đầu vào không?
Maltysen

@Maltysen Bạn có thể bỏ qua dòng đầu tiên nếu bạn muốn, mặc dù vui lòng ghi chú lại trong bài gửi của bạn.
absinthe

1
@absinthe - Bộ bỏ phiếu của Úc không còn nữa, bạn có bản sao của nó ở bất cứ đâu không?
pixma140

Câu trả lời:



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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng ma trận, với mỗi cột biểu thị các lựa chọn của một cử tri. Hoạt động bằng cách đệ quy: tìm một ứng cử viên có số phiếu tối thiểu, xóa tất cả các mục tương ứng trong ma trận, định dạng lại ma trận và lặp lại cho đến khi ma trận chỉ có 1 hàng.

Số phiếu ở mỗi lần lặp được tính bằng cách đếm với tablecác giá trị ở hàng trên cùng, đây là những lựa chọn hàng đầu hiện tại của mỗi cử tri. Điều này được xáo trộn với sampleđể phá vỡ quan hệ một cách ngẫu nhiên.

n<-dim(m)-1đưa ra một vectơ có độ dài 2, nhưng chỉ sử dụng giá trị đầu tiên (vì vậy nó tương đương, nhưng ngắn hơn 1 byte so với, n<-nrow(m)-1). Giá trị này được sử dụng hai lần: đầu tiên nó được so sánh với 0 để kiểm tra xem lần lặp cuối cùng đã đạt được chưa; thứ hai, nếu chúng ta lặp lại, đó là số lượng hàng của ma trận mới.


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*

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng danh sách các danh sách ưu tiên cử tri (không bao gồm hàng tiêu đề). Sự ngẫu nhiên trong trường hợp hòa là vexing!



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)

Hãy thử trực tuyến!

Sử dụng ID đối tượng của mảng làm nguồn 'ngẫu nhiên'.
Dựa trên câu trả lời của Chas Brown - Tôi không có đủ đại diện để bình luận!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.