จำลองการเลือกตั้งที่ไหลบ่าทันที


15

มันคือการเลือกตั้ง! พื้นที่ที่เราอยู่ในระบบการลงคะแนนที่เรียกว่าrunoff ทันที (บางครั้งเรียกว่าการลงคะแนนทางเลือกหรือการลงคะแนนพิเศษ ) ผู้มีสิทธิเลือกตั้งแต่ละคนสั่งให้ผู้สมัครแต่ละคนเลือกจากที่ต้องการมากที่สุดให้เลือกน้อยที่สุดทำเครื่องหมาย "1" สำหรับผู้สมัครที่ต้องการมากที่สุดของพวกเขาเป็น "2" สำหรับผู้สมัครที่สองของพวกเขาและอื่น ๆ จนกว่าผู้สมัครแต่ละคนจะถูกกำหนดหมายเลข ฉันจะให้โคอาล่าที่เป็นมิตรนี้อธิบายส่วนที่เหลือ:

การลงคะแนนพิเศษ

(รูปภาพดัดแปลงมาจากต้นฉบับโดยPatrick Alexanderใช้ภายใต้ใบอนุญาต 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

จะหมายความว่าการลงคะแนนเสียงโดยเฉพาะมีอเล็กซานเดอร์เป็นอันดับแรกของพวกเขา, เซโมลินาหมอผีเป็นที่สองของพวกเขา, เอกภาพไม่ใช่สองเป็นสามของพวกเขา, ฯลฯ . คุณสามารถสันนิษฐานได้ว่าการลงคะแนนทุกครั้งจะมีผู้สมัครทุกคน

เมื่อได้รับคะแนนโหวตจากการป้อนข้อมูลแล้วโปรแกรมหรือฟังก์ชั่นของคุณควรแสดงผลผู้ชนะการเลือกตั้ง คุณสามารถค้นหาการดำเนินการอ้างอิง ungolfed ในหลาม 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 คุณสามารถละเว้นบรรทัดแรกหากคุณต้องการแม้ว่าโปรดจดบันทึกไว้ในการส่งของคุณ
absinthe

1
@absinthe - ชุดลงคะแนนเสียงของออสเตรเลียไม่ได้อยู่ที่นั่นอีกต่อไปคุณมีสำเนาชุดไหน?
pixma140

คำตอบ:


3

Pyth - 30 ไบต์

จะ refactor มัน ป้อนบรรทัดแรกจากอินพุตที่เหลือ

WgclQ2leKlD.gkhMQ=Q-RhhJKQ;hhJ

Test Suite


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)

ลองออนไลน์!

ใช้ ID อ็อบเจ็กต์ของอาร์เรย์เป็นแหล่งที่มาของ 'randomness'
ตามคำตอบของ Chas Brown - ฉันไม่มีตัวแทนมากพอที่จะแสดงความคิดเห็น!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.