주정부는 몇 표를 얻습니까?


9

각주의 인구 목록이 주어지면, 가장 큰 것부터 가장 적은 것까지, 주가 선거 대학에서받는 투표 수를 산출합니다.

입력 : 첫 번째 숫자는 배포 할 총 투표 수를 나타냅니다. 그 다음에 인구리스트가 이어집니다. 이 예에서는 상태의 약어가 사용되지만 대문자와 소문자가 포함 된 이름을 사용할 수 있습니다. 여기에 포함 된 유일한 정보가 주 약자와 인구 집단 인 한, 원하는 형식으로 취할 수 있습니다.

입력은 함수 또는 원하는 방식으로 인수로 사용할 수 있습니다.

입력 가능 예 : 538 [[CA 38000000], [NH 1300000] etc.]

결과 : 각 주가 얻는 투표 수를 어떤 형식으로 출력합니다. 상태를 최대에서 최소로 주문하십시오. 두 주가 같은 수의 투표권을 가지고 있다면, 사전에서 알파벳순으로 나오는 이름을 순서대로 정렬하십시오.

투표 수를 찾기 전에 먼저 입력 목록에 DC라는 이름의 주가 있는지 확인하고, 존재하는 경우 인구에 관계없이 주 3에 투표하십시오. 그런 다음 목록에서 제거하고 DC가 존재하지 않는 것처럼 나머지 투표를 할당하십시오.

선거 대학의 투표 수는 상원 의원과 대표의 수로 정의됩니다. 모든 주에는 2 명의 상원 의원이 있으므로 총 대표 (예시 입력에서는 538)에서 주 수의 두 배를 빼서 대표자 수를 얻습니다. 모든 주에 하나의 담당자를 지정하십시오. 그런 다음 다음 프로세스를 수행하십시오.

  1. 각 주에 모집단이 A있는 P/sqrt(2)곳에 정의 된 번호를 지정하십시오 P.

  2. 의 값에 따라 상태를 정렬하십시오 A.

  3. 첫 번째 상태 (가장 큰 상태 A)에 담당자를 한 명 더 지정하십시오 .

  4. 의 값은 재 할당 A로서 A = P/(sqrt(n)*sqrt(n + 1)), 여기서 n상태에 할당 된 대표 현재 수있다.

  5. 2 단계로 돌아가십시오. 모든 담당자가 없어 질 때까지 반복하십시오.

예제 출력 가능 : {CA: 518, NH: 20}. 출력은이 형식 일 필요는 없지만 동일한 정보를 포함해야합니다.

투표 수보다 적어서 투표를 합법적으로 할당 할 수없는 경우 3*(# of states)원하는 것을 인쇄하십시오. 충돌하거나 오류가 발생할 수 있습니다.

테스트 사례 :

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

라고 단계 예상 출력을 확인하고 그것으로 내 코드를 비교 한 후 "의 재 할당 값 A으로, A = P/(sqrt(n)*sqrt(n + 1))여기서 n상태에 할당 된 멤버의 현재 수입니다." 변경되어야 "의 값을 재 할당하는 단계 A로서 A = P/(sqrt(n)*sqrt(n + 1)), 여기서 n의 현재 개수 대표 상태에 할당.". 그것은 나를 버렸다.
Patrick Roberts

주 수가 투표 수의 절반 이상인 경우 어떻게됩니까?
msh210

답변:


3

청소 , 263 244 222 바이트

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)

같은 전화

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

Ungolfed 버전, 전체 프로그램 ( 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)

2

자바 스크립트 ES6, 249 바이트 244 바이트

(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))}

테스트 사례

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>'
);

5 바이트 절약으로 @Neil에게 감사드립니다!


.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))작동하면 바이트를 절약 할 수 있습니다.
Neil

@Neil 그것은 똑같은 일을하지 않습니다. 요점은 0 번째 인덱스가 r매번 대표 속성 이 증가 하는 유일한 인덱스라는 것입니다 .
Patrick Roberts

그래서 내가 사용 .some하지 않은 이유 .map입니다.
Neil

예, i더 이상 사용하지 않기 때문에 5 바이트 입니다. 좋은!
Neil

@Neil 방금 상태 인구가 0 인 시나리오에서는 이것이 작동하지 않는다는 것을 깨달았습니다. 동등한 바이트로 대체 솔루션으로 업데이트하십시오.
Patrick Roberts

1

파이썬 2, 219 바이트

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)

다음과 같이 입력을받습니다.

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

인쇄물:

[('M', 241), ('L', 140), ('K', 39)]

필자는 구문에서 필수 부분 인 들여 쓰기로 인해 파이썬에서 전체 프로그램을 작성하는 것이 함수를 작성하는 것보다 거의 항상 바이트 수를 줄이는 방법이 재미 있다는 것을 알았습니다.
패트릭 로버츠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.