選挙の時間です!


13

投票を数える時です!

今日、私の全国で地方選挙があります。ここで、各パーティーの座席数は、D'Hondtメソッドを使用して決定されます。あなたの目標は、各パーティが取得する座席数を最短のバイト数で決定するプログラムまたは機能を実装することです。

この方法では、配布するシートの数が固定されており、次のようになります。

  1. すべての当事者には、獲得した投票数から始まる変数番号が割り当てられます。
  2. そして、最初のシートは、その変数で最大の値を持つ当事者に与えられ、そのパーティーのための値になることで割っ票のその総数は1+seats、丸みを帯びたダウン、seatsそれが既に持っている座席の数は(取得した後そうです最初に、彼らの票は2で割られ、2番目の議席を獲得した後は3で割られます)。
  3. その後、当事者の投票が再度比較されます。このプロセスは、すべての座席が割り当てられるまで続きます。

最大数が2つ以上の関係者の間の同点である場合、ランダムに解決されます(ランダムである必要があり、リストの2つのうちの最初の数だけになることはできません)。

入力

あなたは数受け取る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

検索で同​​じようなものを見つけることができませんでした...しかし、何かを見つけた場合、私はそれを変更するか、質問を削除します、問題ありません!
ロルク

@rcrmn最後の例に何か問題があります。たぶん、あなたは代わりに135の153合計議席意味
Tyilo

@Tyilo Right!テストプログラムで間違って記述し、二重チェックせずに回答をコピーしました。現在修正されています。ありがとうございました!
ロルク

1
@Jakubeに感謝します。これは、計算に使用したプログラムの問題で、ラベル付きの席で注文した出力を返しました。デニスは、ラベルが識別子として機能するため、任意の順序で返すことができます。それはあなたのためにそれが簡単である場合にのみ文字を持っていると仮定することができます。
ロルク

回答:


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いいえ、非常に重要です。シャッフルのため、式は異なる結果をもたらす可能性があり.e、カウントを台無しにします。
ジャクベ

1
実際、2番目のヒントも機能しませんUQ。申し訳ありません。
isaacg

2
@isaacg回答として投稿してください。
ジャクベ

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
すべての変数を引数として宣言する必要はありません。
アンダースコア

2
はい。ただし、可能性のあるグローバルスコープの汚染を避けたいと思っていました
user2951302

1
JSゴルフは、ゴールスコープを汚染することについてすべてです:)
nderscore

2
私はあなたの方法を168バイトにまで減らしました。変数名をマングリングしてすみません。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

vzandのQ代わりにGandを使用しZます。このようにして、割り当てをで保存しAます。
ジャクベ

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.