一个州获得多少票?


9

给定每个州的人口列表,输出从大到小,即该州在选举团中获得的选票数。

输入:第一个数字代表要分配的总票数;其后是和的列表。在此示例中,使用状态的缩写,但是可以使用任何包含大写和小写字母的名称。您可以采用任何喜欢的格式,只要其中包含的唯一信息是该州的缩写及其人口。

输入可以作为函数的参数,也可以采用任何方式。

示例(可能)输入: 538 [[CA 38000000], [NH 1300000] etc.]

输出:以某种格式输出每个州获得的票数。从最大到最小对状态进行排序。如果两个州的票数相同,则按字典中的先后顺序(按字母顺序先后)排序。

在找到投票数之前,首先检查输入列表中是否存在名为DC的州,如果存在,请给该州3票,而不论其人口多少。然后,将其从列表中删除,并分配其余的选票,就好像DC不存在一样。

选举团的票数被定义为参议员和代表人数的总和。每个州都有两名参议员,因此从总数中减去州数两倍(在示例输入中为538)以获得代表人数。为每个州指派一名代表开始。然后,执行以下过程:

  1. 分配给每个状态的数目,A,定义为P/sqrt(2)其中P是人口。

  2. 根据状态值对状态进行排序A

  3. 为第一个州(最大的州)分配A一个代表。

  4. 重新分配A,as的值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

在检查了预期的输出并与我的代码进行比较之后,执行以下步骤:“将的值重新分配AA = P/(sqrt(n)*sqrt(n + 1)),其中n是分配给该州的当前成员数。” 应该将其更改为“ A,作为的重新分配值A = P/(sqrt(n)*sqrt(n + 1)),其中n是当前分配给该州的代表人数”。那让我失望了。
Patrick Roberts

如果州数超过票数的一半,该怎么办?
msh210 '16

Answers:


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

非高尔夫版本,完整程序(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

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

感谢@Neil节省5个字节!


.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))如果可以,将为您节省一个字节。
尼尔

@Neil不会做同样的事情。关键是,第0个索引是唯一一个代表属性r每次递增的索引。
Patrick Roberts

这就是为什么我.some不使用.map
尼尔

哦,是的,有5个字节,因为您不再使用i了。真好!
尼尔

@Neil我只是意识到这对于状态填充为0的情况不起作用。更新为具有等效字节的备用解决方案。
Patrick Roberts

1

Python 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)]

我总是觉得很有趣,因为缩进是语法的强制性部分,因此用Python编写完整程序几乎总是比编写函数少字节。
帕特里克·罗伯茨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.