ถึงเวลาเลือกตั้ง!


13

ถึงเวลา ... เพื่อนับคะแนน!

วันนี้มีการเลือกตั้งท้องถิ่นทั่วประเทศของฉัน ที่นี่จำนวนที่นั่งสำหรับแต่ละบุคคลที่จะตัดสินใจใช้วิธี Hondt ศิลปวัตถุ เป้าหมายของคุณคือการใช้โปรแกรมหรือฟังก์ชั่นที่จะตัดสินจำนวนที่นั่งที่แต่ละฝ่ายได้รับในจำนวนไบต์ที่สั้นที่สุด

สำหรับวิธีนี้มีจำนวนที่นั่งที่แน่นอนในการแจกจ่ายและทำเช่นนั้น:

  1. ทุกฝ่ายมีการกำหนดหมายเลขตัวแปรซึ่งเริ่มจากจำนวนคะแนนที่ได้รับ
  2. จากนั้นที่นั่งแรกจะถูกมอบให้กับบุคคลที่มีค่ามากที่สุดในตัวแปรของพวกเขาและจากนั้นค่าสำหรับพรรคนั้นจะกลายเป็นจำนวนคะแนนรวมหารด้วย1+seatsปัดเศษลงซึ่งseatsเป็นจำนวนที่นั่งที่มีอยู่แล้ว (ดังนั้นหลังจากได้รับ ก่อนคะแนนของพวกเขาจะถูกหารด้วย 2 และ 3 หลังจากได้ที่นั่งที่สอง)
  3. หลังจากนั้นฝ่ายต่างๆจะทำการโหวตอีกครั้ง กระบวนการนี้จะดำเนินต่อไปจนกว่าจะมีการกำหนดที่นั่งทั้งหมด

หากจำนวนสูงสุดคือการเสมอกันระหว่างสองฝ่ายหรือมากกว่าฝ่ายนั้นจะได้รับการแก้ไขแบบสุ่ม (ต้องเป็นแบบสุ่มมันไม่สามารถเป็นอันดับแรกของทั้งสองฝ่ายในรายการ)

อินพุต

คุณจะได้รับหมายเลขNซึ่งจะระบุจำนวนที่นั่งที่มีอยู่และรายการคะแนนโหวตที่แต่ละฝ่ายได้รับในรูปแบบที่คุณต้องการ ตัวอย่าง:

25
12984,7716,13009,4045,1741,1013

เอาท์พุต

คุณควรส่งรายการที่นั่งที่แต่ละฝ่ายได้รับ ในตัวอย่างข้างต้นมันจะเป็นอย่างไร

8,5,9,2,1,0

พวกเขาควรอยู่ในลำดับเดียวกันกับฝ่ายต่างๆในอินพุต

ตัวอย่าง

5
3,6,1

outputs: 2,3,0

135
1116259,498124,524707,471681,359705,275007,126435

outputs: 45,20,21,19,14,11,5

โบนัส

โบนัส -20%ถ้าใช้ชื่อปาร์ตี้เป็นอินพุทและให้พวกมันในเอาท์พุทเช่น:

25
cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013

outputs

cio:8
pcc:5
irc:9
icb:2
cub:1
bb:0

ฉันรู้สึกว่าเราทำสิ่งนี้ไปแล้ว
edc65

ฉันไม่พบสิ่งใดที่เหมือนกันในการค้นหา ... แต่ถ้าคุณพบสิ่งใดฉันจะเปลี่ยนหรือลบคำถามไม่มีปัญหา!
rorlork

@rcrmn มีบางอย่างผิดปกติกับตัวอย่างสุดท้ายของคุณ บางทีคุณอาจหมายถึง 153 ที่นั่งทั้งหมดแทน 135
Tyilo

@Tyilo ใช่แล้ว! ฉันเขียนผิดในโปรแกรมทดสอบและคัดลอกคำตอบโดยไม่ตรวจสอบซ้ำ ตอนนี้ได้รับการแก้ไขแล้ว ขอขอบคุณ!
rorlork

1
ขอบคุณ @Jakube นั่นเป็นปัญหาของโปรแกรมที่ฉันใช้ในการคำนวณซึ่งส่งคืนผลลัพธ์ที่สั่งซื้อในที่นั่งที่มีป้ายกำกับ เดนนิสคุณสามารถส่งคืนได้ในลำดับใด ๆ เนื่องจากฉลากทำงานเป็นตัวระบุ คุณสามารถสันนิษฐานได้ว่ามันมีตัวอักษรถ้ามันง่ายกว่าสำหรับคุณ
rorlork

คำตอบ:


6

CJam, 35.2 28.8 28.0 26.4

q2*~,m*mr{~)f/1=~}$<:(f{1$e=1\tp}

โปรแกรมเต็มรูปแบบนี้มีความยาว 33 ไบต์และมีสิทธิ์ได้รับโบนัส

ลองใช้ออนไลน์ในล่าม CJam

ตัวอย่างการวิ่ง

$ cjam seats <<< '[["cio"12984]["pcc"7716]["irc"13009]["icb"4045]["cub"1741]["bb"1013]]25'
["cio" 8]
["pcc" 5]
["irc" 9]
["icb" 2]
["cub" 1]
["bb" 0]

มันทำงานอย่างไร

q2*~   e# Repeat the input from STDIN twice. Evaluate.
       e# STACK: Array seats Array seats
,      e# Range: seats -> [0 ... seats-1]
m*     e# Take the cartesian product of the array from the input and the range.
mr     e# Shuffle the array. This makes sure tie breakers are randomized.
{      e# Sort by the following key:
  ~    e#     Dump: [["party" votes] number] -> ["party" votes] number
  f/   e#     Divide each: ["party" votes] number -> ["party"/number votes/number]
  1=   e#     Select: ["party"/number votes/number] -> votes/number
  ~    e#     Bitwise NOT.
}$     e#
<      e# Keep only the elements that correspond to seats.
:(     e# Shift each array.
       e# RESULT: S := [[number] ["party" votes] [number] ["party" votes] ...]
f{     e# For each A := ["party" votes]:
       e#     Push S.
  1$   e#     Push a copy of A.
  e=   e#     Count the occurrences of A in S.
  1\t  e#     Replace the vote count with the number of occurrences.
  p    e#     Print.
}      e#

6

Pyth, 36 ไบต์ - 20% = 28.8

J<_hCo/@eCQhNheN.S*UQUvzvz.e,b/JkhCQ

สิ่งนี้มีคุณสมบัติตรงตามโบนัส

ลองใช้ออนไลน์: การสาธิตหรือชุดควบคุมการทดสอบ

คำอธิบาย:

                                       implicit: z = 1st input (as string)
                                                 Q = 2nd input (evaluated)

                      vz               evaluate z (#seats)
                     U                 generate the list [0,1,...,seats-1]
                   UQ                  generate the list [0,1,...,len(Q)-1]
                  *                    Cartesian product of these lists
                .S                     shuffle (necessary for break ties randomly)
     o                                 order these tuples N by:
        eCQ                               list of votes
       @   hN                             take the N[0]th vote count
      /      heN                          and divide by N[1]+1
   hC                                  extract the party index of the tuples
  _                                    reverse the list
 <                      vz             take the first #seats elements
J                                      and store them in J

                          .e     hCQ   enumerated map over the names of the parties
                                       (k = index, b = name):
                            ,             generate the pair:
                             b/Jk            name, J.count(k)
                                       print implicitely

Jไม่จำเป็น คุณสามารถกำจัดมันและบันทึก 2 ไบต์
isaacg

นอกจากนี้ถ้าคุณสลับzและQจากนั้นให้บันทึกCvzการKคุณสามารถบันทึกไบต์อีก
isaacg

@isaacg Nope มันสำคัญมาก เนื่องจากการสับการแสดงออกอาจให้ผลลัพธ์ที่แตกต่างกัน.eและมันทำให้การนับยุ่งเหยิง
Jakube

1
UQที่จริงเคล็ดลับที่สองไม่ทำงานอย่างใดอย่างหนึ่งขอโทษเพราะผมพลาด
isaacg

2
@isaacg โพสต์เป็นคำตอบ
Jakube

5

Javascript, 210 ไบต์

v=(a,b,c,d,e,f,g)=>{d=Object.assign({},b),c={};for(g in b)c[g]=0;for(;a--;)e=0,f=Object.keys(d),f.forEach(a=>e=d[a]>e?d[a]:e),f=f.filter(a=>d[a]===e),f=f[~~(Math.random()*f.length)],d[f]=b[f]/-~++c[f];return c}

หมายเหตุ:

  • ต้องใช้เบราว์เซอร์ / เครื่องมือที่ทันสมัยพร้อมรองรับ ES6 ทดสอบใน Firefox
  • ใช้ตัว/-~++ดำเนินการที่สำคัญมาก:)

ตัวอย่างการใช้งาน:

v(25, {cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013})

1
ไม่จำเป็นต้องประกาศตัวแปรทั้งหมดของคุณเป็นอาร์กิวเมนต์
nderscore

2
ใช่ แต่ฉันต้องการหลีกเลี่ยงการสร้างมลภาวะในขอบเขตที่เป็นไปได้ทั่วโลก
2951302

1
JS กอล์ฟเป็นข้อมูลเกี่ยวกับมลพิษขอบเขต Gobal :)
nderscore

2
ฉันตีกอล์ฟวิธีการของคุณลงไปที่ 168 ไบต์ ขออภัยที่ mangling ชื่อตัวแปร F=(N,X)=>{for(t=[o={}],[t[o[j]=0,j]=X[j]for(j in X)];N--;t[z=y[new Date%y.length]]=X[z]/-~++o[z])m=0,y=[(m=m<t[j]?t[j]:m,j)for(j in X)],y=y.filter(j=>t[j]==m);return o}
nderscore

4

Pyth - 54 ไบต์

AGZQ=kZK*]0lZVGJhOfqeTh.MZZ.e(kb)Z XJK1 XZJ/@kJ+@KJ1;K

รูปแบบอินพุต (stdin):

[25,[12984,7716,13009,4045,1741,1013]]

รูปแบบเอาต์พุต (stdout):

[8, 5, 9, 2, 1, 0]

ตัวแปรที่ใช้:

G = total number of seats
K = array of seats currently assigned to each party
k = number of votes for each party
Z = k/(K+1)
J = which party should have the next seat

การใช้งานvzและการQแทนและG วิธีนี้คุณจะประหยัดที่ได้รับมอบหมายด้วยZ A
Jakube

2

Perl, 110

#!perl -pa
$n=pop@F;@x=map
0,@F;/a/,$x[$'/$n]++for(sort{$b-$a}map{map{($'/$_|0).rand.a.$i++}//..$n}@F)[0..$n-1];$_="@x"

พื้นที่อินพุตคั่นด้วยจำนวนที่นั่งสุดท้าย

ลองฉัน

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