Seçim zamanı!


13

Oyları saymanın zamanı geldi!

Bugün bütün ülkemde yerel seçimler var. Burada, her bir taraf için koltuk sayısına D'Hondt yöntemi kullanılarak karar verilir . Amacınız, her bir tarafın kaç sandalye alacağına, en kısa bayt miktarına karar verecek bir program veya işlev uygulamaktır.

Bu yöntem için dağıtılacak sabit sayıda koltuk vardır ve böyle yapılır:

  1. Her partiye, aldığı oy sayısında başlayan değişken bir sayı verilir.
  2. Daha sonra ilk koltuk, değişkenlerinde en büyük değere sahip olan partiye verilir ve daha sonra bu parti için bu değer, toplam oy sayısına bölünür 1+seats, yuvarlanır, seatszaten sahip olduğu koltuk sayısına (yani Birincisi, oyları 2'ye, ikinci koltuğu aldıktan sonra 3'e bölünür).
  3. Bundan sonra partilerin oyları yeniden karşılaştırılır. İşlem tüm koltuklar atanana kadar devam eder.

En yüksek sayı iki veya daha fazla taraf arasındaki bir kravatsa, rastgele çözülür (Rasgele olmak zorundadır, listedeki ikisinden sadece biri olamaz).

Giriş

Kullanabileceğiniz Nkoltuk sayısını ve her bir tarafın aldığı oyların listesini istediğiniz formatta gösteren bir numara alacaksınız . Misal:

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

Çıktı

Her bir tarafın sahip olduğu koltukların bir listesini çıkarmalısınız. Yukarıdaki örnekte şöyle bir şey olurdu:

8,5,9,2,1,0

Girdideki taraflarla aynı sırada olmalıdırlar.

Örnekler

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

Tarafların adını girdi olarak alır ve çıktıda verirse, örneğin % -20 bonus :

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

Zaten böyle bir şey yaptığımızı hissediyorum
edc65

Aramada benzer bir şey bulamadım ... Ama bir şey bulursanız değiştireceğim ya da soruyu kaldıracağım, sorun değil!
rorlork

@rcrmn Son örneğinizde bir sorun var. Belki 135 yerine 153 toplam koltuk demek
istediniz

@Tyilo Doğru! Test programımda yanlış yazdım ve cevapları tekrar kontrol etmeden kopyaladım. Şimdi düzeltildi. Teşekkür ederim!
rorlork

1
Teşekkürler @ Jakube, hesaplamak için kullandığım programla ilgili bir problemdi, bu da etiketli koltuklarda sipariş çıktısını döndürdü. Dennis, etiket tanımlayıcı olarak çalıştığı için istediğiniz sırada iade edebilirsiniz. Sadece sizin için daha kolaysa harfleri olduğunu varsayabilirsiniz.
rorlork

Yanıtlar:


6

CJam, 35,2 28,8 28,0 26,4

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

Bu tam program 33 bayt uzunluğundadır ve bonusa hak kazanır.

CJam yorumlayıcısında çevrimiçi deneyin .

Örnek çalışma

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

Nasıl çalışır

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 bayt -% 20 = 28,8

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

Bu bonusa hak kazanır.

Çevrimiçi deneyin: Gösteri veya Test koşum takımı

Açıklama:

                                       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

Jgereksizdir. Ondan kurtulabilir ve 2 bayt tasarruf edebilirsiniz.
isaacg

Ayrıca, takas eğer zve Qve sonra kaydetme Cvziçin K, başka bir bayt kaydedebilirsiniz.
isaacg

@isaacg Hayır, bu çok önemli. Karıştırma nedeniyle ifade farklı sonuçlar verebilir .eve sayımı bozar.
Jakube

1
Aslında, ikinci ipucu da çalışmıyor, üzgünüm, çünkü özledim UQ.
isaacg

2
@isaacg Cevap olarak gönder.
Jakube

5

Javascript, 210 bayt

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}

Notlar:

  • ES6 desteği olan modern bir tarayıcı / motor gerektirir. Firefox'ta test edildi.
  • Çok önemli /-~++operatörü kullanır :)

Örnek kullanım:

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

1
Tüm değişkenlerinizi bağımsız değişken olarak bildirmeniz gerekmez.
nderscore

2
Evet, ancak olası küresel kapsamı kirletmekten kaçınmak istedim
user2951302

1
JS golf tamamen
gobal

2
Metodunu 168 bayta kadar golf oynadım. Değişken adlarını değiştirdiğim için üzgünüm. 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 bayt

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

Giriş formatı (stdin):

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

Çıktı biçimi (stdout):

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

Kullanılan değişkenler:

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

Kullanım vzve Qyerine Gve Z. Bu şekilde ödevi ile kaydedersiniz 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"

Giriş alanı, koltuk sayısıyla en son ayrılmış.

Beni dene .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.