Nhà nước nhận được bao nhiêu phiếu?


9

Đưa ra một danh sách các quần thể của mỗi tiểu bang, sản lượng, từ lớn nhất đến ít nhất, số phiếu mà tiểu bang nhận được trong trường đại học bầu cử.

Đầu vào: Số đầu tiên thể hiện tổng số phiếu bầu cần phân phối; nó được theo sau bởi một danh sách và dân số. Trong ví dụ này, chữ viết tắt cho các trạng thái được sử dụng, nhưng bất kỳ tên nào chứa chữ hoa và chữ thường đều có thể được sử dụng. Bạn có thể lấy cái này ở bất kỳ định dạng nào bạn thích, miễn là thông tin duy nhất có trong đó là chữ viết tắt của tiểu bang và dân số của nó.

Đầu vào có thể được lấy làm đối số cho hàm hoặc bất kỳ cách nào bạn muốn.

Ví dụ (có thể) đầu vào: 538 [[CA 38000000], [NH 1300000] etc.]

Đầu ra: Đầu ra, ở một số định dạng, số phiếu mỗi bang đạt được. Đặt hàng các tiểu bang từ lớn nhất đến ít nhất. Nếu hai tiểu bang có cùng số phiếu bầu, hãy đặt hàng theo tên nào sẽ đứng đầu trong từ điển (xuất hiện trước theo thứ tự bảng chữ cái).

Trước khi tìm thấy số phiếu, trước tiên hãy kiểm tra xem có một tiểu bang tên DC trong danh sách đầu vào không, và nếu có, hãy cho tiểu bang 3 phiếu, bất kể dân số của nó. Sau đó, xóa nó khỏi danh sách và chỉ định phần còn lại của phiếu bầu như thể DC không tồn tại.

Số phiếu trong trường đại học bầu cử được xác định là tổng số lượng thượng nghị sĩ và đại diện. Mỗi tiểu bang có hai thượng nghị sĩ, nên trừ hai lần số lượng trạng thái trong tổng số (538, trong ví dụ đầu vào) để có được số lượng đại diện. Chỉ định mỗi đại diện một tiểu bang để bắt đầu. Sau đó, thực hiện quy trình sau:

  1. Chỉ định mỗi trạng thái một số A, được xác định là P/sqrt(2)nơi Pdân số.

  2. Sắp xếp các trạng thái theo giá trị của chúng A.

  3. Chỉ định trạng thái đầu tiên (trạng thái lớn nhất A) thêm một đại diện.

  4. Xác định lại các giá trị của A, như A = P/(sqrt(n)*sqrt(n + 1)), nsố lượng đại diện hiện tại được gán cho nhà nước.

  5. Quay trở lại bước 2. Lặp lại cho đến khi tất cả các đại diện đã hết.

Ví dụ (có thể) đầu ra : {CA: 518, NH: 20}. Đầu ra không phải ở định dạng này, nhưng phải chứa cùng thông tin.

Lưu ý rằng nếu không thể chỉ định phiếu hợp pháp vì có ít hơn 3*(# of states)số phiếu, hãy in bất cứ điều gì bạn muốn. Bạn có thể gặp sự cố, ném lỗi, v.v.

Các trường hợp thử nghiệm:

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

Sau khi kiểm tra đầu ra dự kiến ​​và so sánh mã của tôi với mã đó, bước có nội dung "Xác định lại các giá trị của A, như A = P/(sqrt(n)*sqrt(n + 1)), nsố lượng thành viên hiện tại được gán cho trạng thái". nên được thay đổi thành "Xác định lại các giá trị của A, như A = P/(sqrt(n)*sqrt(n + 1)), nsố lượng đại diện hiện tại được gán cho nhà nước." Điều đó đã ném tôi đi.
Patrick Roberts

Điều gì sẽ xảy ra nếu số lượng bang nhiều hơn một nửa số phiếu?
msh210

Câu trả lời:


3

Sạch sẽ , 263 244 222 byte

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)

Gọi như

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

Phiên bản Ungolfed, chương trình đầy đủ ( 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 byte 244 byte

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

Các trường hợp thử nghiệm

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

Tín dụng cho @Neil để tiết kiệm 5 byte!


.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))sẽ tiết kiệm cho bạn một byte nếu nó hoạt động.
Neil

@Neil Điều đó không làm điều tương tự. Vấn đề là, chỉ số 0 là chỉ số duy nhất có thuộc tính đại diện rđược tăng lên mỗi lần.
Patrick Roberts

Đó là lý do tại sao tôi sử dụng .somevà không .map.
Neil

Ồ, vâng, 5 byte, vì bạn không sử dụng inữa. Đẹp!
Neil

@Neil Tôi mới nhận ra điều này sẽ không hoạt động cho một kịch bản trong đó dân số nhà nước là 0. Đang cập nhật giải pháp thay thế với các byte tương đương.
Patrick Roberts

1

Python 2, 219 byte

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)

Đưa đầu vào là

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

Bản in:

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

Tôi luôn thấy buồn cười khi viết một chương trình đầy đủ bằng Python hầu như luôn luôn ít byte hơn so với viết một hàm vì thụt lề là một phần bắt buộc của cú pháp.
Patrick Roberts
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.