Saatnya pemilihan!

13

Sudah waktunya ... untuk menghitung suara!

Hari ini ada pemilihan lokal di seluruh negara saya. Di sini, jumlah kursi untuk masing-masing pihak diputuskan menggunakan metode D'Hondt . Tujuan Anda adalah untuk mengimplementasikan program atau fungsi yang akan memutuskan berapa banyak kursi yang didapat masing-masing pihak, dalam jumlah byte terpendek.

Untuk metode ini ada jumlah kursi yang tetap untuk dibagikan, dan dilakukan seperti ini:

  1. Setiap pihak diberi nomor variabel, yang dimulai dari jumlah suara yang didapat.
  2. Kemudian kursi pertama diberikan kepada partai yang memiliki nilai terbesar dalam variabel mereka dan kemudian nilai untuk partai itu menjadi jumlah total suara dibagi dengan 1+seats, dibulatkan ke bawah, di mana seatsjumlah kursi yang dimilikinya (jadi setelah mendapatkan pertama, suara mereka dibagi 2, dan 3 setelah mendapatkan kursi kedua).
  3. Setelah itu suara partai dibandingkan lagi. Proses berlanjut sampai semua kursi telah ditetapkan.

Jika angka tertinggi adalah ikatan antara dua pihak atau lebih, itu diselesaikan secara acak (Itu harus acak, itu tidak bisa hanya menjadi yang pertama dari dua pihak dalam daftar).

Memasukkan

Anda akan menerima nomor N, yang akan menunjukkan jumlah kursi yang tersedia, dan daftar suara yang diterima masing-masing pihak, dalam format apa pun yang Anda inginkan. Contoh:

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

Keluaran

Anda harus menampilkan daftar kursi yang dimiliki masing-masing pihak. Pada contoh di atas akan menjadi sesuatu seperti

8,5,9,2,1,0

Mereka harus berada dalam urutan yang sama dengan para pihak dalam input.

Contohnya

5
3,6,1

outputs: 2,3,0

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

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

Bonus

-20% bonus jika mengambil nama pihak sebagai input dan memberikannya dalam output, seperti misalnya:

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
rorlork
sumber
Saya merasa kami sudah melakukan hal seperti ini
edc65
Saya tidak dapat menemukan apa pun yang sama dalam pencarian ... Tetapi jika Anda menemukan sesuatu, saya akan mengubahnya atau menghapus pertanyaan, tidak masalah!
rorlork
@ rcrmn Ada yang salah dengan contoh terakhir Anda. Mungkin maksud Anda 153 total kursi, bukan 135.
Tyilo
@ Tyilo Benar! Saya salah menulis di program pengujian saya dan menyalin jawaban tanpa memeriksa ulang. Sudah diperbaiki sekarang. Terima kasih!
rorlork
1
Terima kasih @ Jakube, itu masalah dengan program yang saya hitung, yang mengembalikan output yang dipesan di kursi dengan label. Anda dapat mengembalikannya dalam urutan apa pun, karena label berfungsi sebagai pengenal. Anda dapat menganggapnya hanya memiliki huruf jika lebih mudah bagi Anda.
rorlork

Jawaban:

6

CJam, 35.2 28.8 28.0 26.4

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

Program lengkap ini sepanjang 33 byte dan memenuhi syarat untuk bonus.

Cobalah online di Internet penerjemah CJam .

Contoh dijalankan

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

Bagaimana itu bekerja

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#
Dennis
sumber
6

Pyth, 36 byte - 20% = 28,8

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

Ini memenuhi syarat untuk bonus.

Cobalah online: Demonstrasi atau Uji harness

Penjelasan:

                                       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
Jakube
sumber
Jtidak perlu. Anda dapat menyingkirkannya dan menyimpan 2 byte.
isaacg
Juga, jika Anda bertukar zdan Q, dan kemudian menyimpan Cvzke K, Anda dapat menyimpan byte lain.
isaacg
@isaacg Tidak, ini sangat penting. Karena pengocokan tersebut ekspresi dapat menghasilkan hasil yang berbeda .edan mengacaukan penghitungan.
Jakube
1
Sebenarnya, tip kedua tidak berfungsi juga, maaf, karena saya ketinggalan UQ.
isaacg
2
@isaacg Posting sebagai jawaban.
Jakube
5

Javascript, 210 byte

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}

Catatan:

  • Membutuhkan browser / mesin modern dengan dukungan untuk ES6. Diuji di Firefox.
  • Menggunakan /-~++operator yang sangat penting :)

Contoh penggunaan:

v(25, {cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013})
pengguna2951302
sumber
1
Tidak perlu mendeklarasikan semua variabel Anda sebagai argumen.
nderscore
2
Ya, tapi saya ingin menghindari polusi dari ruang lingkup global yang memungkinkan
user2951302
1
JS golf adalah tentang mencemari ruang lingkup gobal :)
nderscore
2
Saya telah memasukkan metode Anda ke 168 byte. Maaf telah menyebut nama variabel. 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 byte

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

Format input (stdin):

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

Format keluaran (stdout):

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

Variabel yang digunakan:

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
Tyilo
sumber
Gunakan vzdan Qbukannya Gdan Z. Dengan cara ini Anda akan menyimpan tugas dengan 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"

Ruang input dipisahkan dengan jumlah kursi terakhir.

Coba saya .

nutki
sumber