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


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.