Berapa banyak suara yang didapat suatu negara?

9

Diberikan daftar populasi masing-masing negara bagian, keluaran, dari yang terbesar hingga yang paling sedikit, jumlah suara yang diperoleh negara bagian di perguruan tinggi pemilihan.

Input: Angka pertama mewakili jumlah total suara yang akan didistribusikan; diikuti oleh daftar dan populasi. Dalam contoh ini, singkatan untuk negara digunakan, tetapi nama apa pun yang berisi huruf besar dan huruf kecil dapat digunakan. Anda dapat mengambil ini dalam format apa pun yang Anda suka, selama satu-satunya informasi yang terkandung adalah singkatan negara dan populasinya.

Masukan dapat diambil sebagai argumen untuk suatu fungsi, atau dengan cara apa pun yang Anda inginkan.

Input contoh (mungkin): 538 [[CA 38000000], [NH 1300000] etc.]

Keluaran: Keluaran, dalam beberapa format, jumlah suara yang diperoleh setiap negara bagian. Pesan negara bagian dari yang terbesar hingga yang paling kecil. Jika dua negara memiliki jumlah suara yang sama, pesanlah dengan nama apa pun yang akan didahulukan dalam kamus (yang muncul lebih dulu menurut abjad).

Sebelum menemukan jumlah suara, periksa terlebih dahulu apakah ada negara bernama DC dalam daftar input, dan jika ada, berikan negara 3 suara, terlepas dari populasinya. Kemudian, hapus dari daftar dan tetapkan sisa suara seolah-olah DC tidak ada.

Jumlah suara di perguruan tinggi pemilihan didefinisikan sebagai jumlah dari jumlah senator dan perwakilan. Setiap negara bagian mendapat dua senator, jadi kurangi dua kali jumlah negara dari total (538, dalam contoh input) untuk mendapatkan jumlah perwakilan. Tetapkan setiap negara bagian satu wakil untuk memulai. Kemudian, lakukan proses berikut:

  1. Tetapkan setiap negara nomor A,, didefinisikan sebagai di P/sqrt(2)mana Ppopulasi.

  2. Urutkan status menurut nilai mereka A.

  3. Tetapkan status pertama (satu dengan yang terbesar A) satu lagi perwakilan.

  4. Tetapkan kembali nilai A, sebagai A = P/(sqrt(n)*sqrt(n + 1)), di mana njumlah perwakilan saat ini ditugaskan untuk negara.

  5. Kembali ke langkah 2. Ulangi sampai semua perwakilan kehabisan.

Contoh (mungkin) keluaran: {CA: 518, NH: 20}. Outputnya tidak harus dalam format ini, tetapi harus mengandung informasi yang sama.

Perhatikan bahwa jika tidak mungkin untuk memberikan suara secara legal karena jumlah suara kurang dari itu 3*(# of states), cetak apa pun yang Anda inginkan. Anda bisa crash, melempar kesalahan, dll.

Kasus uji:

538 [['CA' 38000000], ['NH' 1300000]] --> CA: 518, NH: 20
538 [['NH' 1300000], ['CA' 38000000]] --> CA: 518, NH: 20 (must be in order from greatest to least!)
538 [['DC' 1000000], ['RH' 1]] --> RH: 535, DC: 3
100 [['A', 12], ['B', 8], ['C', 3]] --> A: 51, B: 35, C: 14
100 [['A', 12], ['B', 8], ['C', 3], ['D', 0]]: --> [49, 34, 14, 3] (yes, even states with no population get votes)
2 [['A', 1]] --> aasdfksjd;gjhkasldfj2fkdhgas (possible output)
12 [['A', 1], ['B', 2], ['C', 3], ['D', 4]] --> A: 3, B: 3, C: 3, D: 3
42 [['K', 123], ['L', 456], ['M', 789]] --> M: 23, L: 14, K: 5
420 [['K', 123], ['L', 456], ['M', 789]] --> M: 241, L: 140, K: 39
135 [['C', 236841], ['D', 55540], ['G', 70835], ['K', 68705], ['M', 278514], ['Ms', 475327], ['Nh', 141822], ['Nj', 179570], ['Ny', 331589], ['Nc', 353523], ['P', 432879], ['R', 68446], ['Sc', 206236], ['Ve', 85533], ['Vi', 630560]] --> Vi: 20, Ms: 16, P: 14, Nc: 12, Ny: 12, M: 10, C: 9, Sc: 8, Nj: 7, Nh: 6, Ve: 5, D: 4, G: 4, K: 4, R: 4
soktinpk
sumber
Setelah memeriksa hasil yang diharapkan dan membandingkan kode saya dengan itu, langkah yang mengatakan "Tetapkan kembali nilai A, seperti A = P/(sqrt(n)*sqrt(n + 1)), di mana njumlah anggota saat ini ditugaskan ke negara." harus diubah menjadi "Tetapkan kembali nilai A, seperti A = P/(sqrt(n)*sqrt(n + 1)), di mana njumlah perwakilan saat ini ditugaskan untuk negara.". Itu membuatku terlempar.
Patrick Roberts
Apa yang harus terjadi jika jumlah negara bagian lebih dari setengah jumlah suara?
msh210

Jawaban:

3

Bersih , 263 244 222 byte

v n s=sortBy(\(a,b)(c,d).b>d)([(t,3.0)\\t<-s|fst t=="DC"]++w(n-3*(length s))[(t,1.0)\\t<-s|fst t<>"DC"])
w 0s=w 0 s=[(p,r+2.0)\\(p,r)<-s]
w n s#s=sortBy(\a b.A a>A b)s
#(p,r)=hd s
=w(n-1)[(p,r+1.0):tl s]
A((_,p),r)=p/sqrt(r*r+r)

Sebut seperti

Start = v 538 [("DC", 1000000.0), ("RH", 1.0)]

Versi tidak digabungkan, program lengkap ( census.icl):

module census

import StdEnv

Start = votes 538 [("DC", 1000000.0), ("RH", 1.0)]

votes n states
# dc = filter (((==)"DC")o fst) states
= sortBy (\(a,b)(c,d).b>d) ([(t,3.0) \\ t <- dc] ++ votes` (n-3*length states) [(t,1.0)\\t<-removeMembers states dc])
where
    votes` 0 states = map (\(p,r).(p,r+2.0)) states
    votes` n states
    # states = sortBy (\a b.A a > A b) states
    # (p,r) = hd states
    = votes` (n-1) [(p,r+1.0):tl states]

    A ((_,p),r) = p / sqrt(r*r+r)

sumber
2

JavaScript ES6, 249 byte, 244 byte

(r,s)=>{r-=s.length*3;s=s.map(t=>({s:t[0],p:t[1],a:t[1]/(q=Math.sqrt)(2),r:1}));while(r--)(t=>t.a=t.p/q(++t.r)/q(t.r+1))(s.filter(t=>t.s!='DC').sort((a,b)=>b.a-a.a)[0]);return''+s.sort((a,b)=>(r=b.r-a.r)?r:a.s>b.s?1:-1).map(t=>t.s+':'+(t.r+2))}

Uji kasus

d = (r, s) => {
  r -= s.length * 3;
  s = s.map(t => ({
    s: t[0],
    p: t[1],
    a: t[1] / (q = Math.sqrt)(2),
    r: 1
  }));
  while (r--)(t => t.a = t.p / q(++t.r) / q(t.r + 1))(s.filter(t => t.s != 'DC').sort((a, b) => b.a - a.a)[0]);
  return '' + s.sort((a, b) => (r = b.r - a.r) ? r : a.s > b.s ? 1 : -1).map(t => t.s + ':' + (t.r + 2))
};

document.write(
  '<pre>' +
  d(135, [
    ['C', 236841],
    ['D', 55540],
    ['G', 70835],
    ['K', 68705],
    ['M', 278514],
    ['Ms', 475327],
    ['Nh', 141822],
    ['Nj', 179570],
    ['Ny', 331589],
    ['Nc', 353523],
    ['P', 432879],
    ['R', 68446],
    ['Sc', 206236],
    ['Ve', 85533],
    ['Vi', 630560]
  ]) +
  '</pre>'
);

Kredit ke @Neil untuk menghemat 5 byte!

Patrick Roberts
sumber
.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))akan menghemat satu byte jika berfungsi.
Neil
@ Neil Itu tidak melakukan hal yang sama. Intinya adalah, bahwa indeks 0 adalah satu-satunya yang atribut perwakilannya rbertambah setiap kali.
Patrick Roberts
Itu sebabnya saya menggunakan .somedan tidak .map.
Neil
Oh, ya, 5 byte, karena Anda tidak menggunakan ilagi. Bagus!
Neil
@Neil Saya baru menyadari ini tidak akan berfungsi untuk skenario di mana populasi negara adalah 0. Memperbarui ke solusi alternatif dengan byte yang setara.
Patrick Roberts
1

Python 2, 219 byte

v,s=input()
n={k:1 for k in s}
v-=3*len(s)
l=lambda x:-x[1]
if'DC'in s:del s['DC']
while v:A,_=sorted([(a,s[a]/(n[a]**2+n[a])**.5)for a in s],key=l)[0];n[A]+=1;v-=1
for a in n:n[a]+=2
print sorted(list(n.items()),key=l)

Mengambil input sebagai

420,{'K':123,'L':456,'M':789}

Cetakan:

[('M', 241), ('L', 140), ('K', 39)]
TFeld
sumber
Saya selalu merasa lucu bagaimana menulis program lengkap dengan Python hampir selalu lebih sedikit byte daripada menulis fungsi karena lekukan menjadi bagian wajib dari sintaks.
Patrick Roberts