선거 시간입니다!


13

투표를 세는 시간입니다!

오늘날 우리 나라에는 지방 선거가 있습니다. 여기서 각 파티의 좌석 수는 D' 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

나는 우리가 이미 이와 같은 것을
느꼈다

검색에서 똑같은 것을 찾을 수 없었습니다.하지만 찾은 내용이 있으면 변경하거나 질문을 제거해도 문제 없습니다!
rorlork

@rcrmn 마지막 예제에 문제가 있습니다. 아마 당신은 135 대신 총 153 석을 의미
했을

@ 타일로! 내 테스트 프로그램에서 잘못 작성하고 다시 확인하지 않고 답변을 복사했습니다. 이제 수정되었습니다. 감사합니다!
rorlork

1
감사합니다 @Jakube, 그것은 계산에 사용한 프로그램의 문제였습니다. Dennis는 라벨이 식별기 역할을하므로 순서에 상관없이 반품 할 수 있습니다. 더 편한 경우 글자 만 가지고 있다고 가정 할 수 있습니다.
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

또한, 당신이 교환하는 경우 zQ다음 저장 CvzK, 다른 바이트를 저장할 수 있습니다.
isaacg

@isaacg 아니, 매우 중요합니다. 셔플 링으로 인해 표현식이 다른 결과를 생성 .e하고 계산을 망칠 수 있습니다.
Jakube

1
실제로 두 번째 팁도 작동하지 않습니다. 죄송합니다 UQ.
isaacg

2
@isaacg 답변으로 게시하십시오.
Jakube

5

자바 스크립트, 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
그렇습니다. 그러나 가능한 모든 범위의 오염을 피하고 싶었습니다.
user2951302

1
JS 골프는
gobal

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

사용 vz하고 Q대신 GZ. 이 방법으로 과제를로 저장합니다 A.
Jakube

2

펄, 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.