Сколько голосов получает государство?


9

Учитывая список населения каждого штата, выведите, от наибольшего до наименьшего, количество голосов, которые штат получает в коллегии выборщиков.

Вход: первое число представляет общее количество голосов для распределения; за ним следует список и населения. В этом примере используются сокращения для состояний, но можно использовать любое имя, содержащее заглавные и строчные буквы. Вы можете взять это в любом формате, который вам нравится, если в нем содержится только информация о штате и его население.

Входные данные могут быть приняты в качестве аргументов функции или любым другим способом.

Пример (возможный) ввод: 538 [[CA 38000000], [NH 1300000] etc.]

Вывод: Выведите в каком-либо формате количество голосов, которое получает каждый штат. Порядок состояний от наибольшего к наименьшему. Если два состояния имеют одинаковое количество голосов, порядок по тому, какое имя будет первым в словаре (который идет в алфавитном порядке).

Прежде чем определить количество голосов, сначала проверьте, есть ли в списке входов штат с именем DC, и, если таковой имеется, дайте этому штату 3 голоса, независимо от его населения. Затем удалите его из списка и назначьте остальные голоса, как если бы DC не существовал.

Количество голосов в коллегии выборщиков определяется как сумма числа сенаторов и представителей. Каждое государство получает двух сенаторов, поэтому для получения количества представителей вычтите удвоенное количество штатов из общего числа (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текущее число представителей, назначенных для государства.». Это сбило меня с толку.
Патрик Робертс

Что должно произойти, если число штатов превышает половину числа голосов?
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

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увеличивается каждый раз.
Патрик Робертс

Вот почему я использовал .someи нет .map.
Нил

О, да, 5 байтов, потому что вы больше не используете i. Ницца!
Нил

@Neil Я только что понял, что это не будет работать для сценария, в котором население штата равно 0. Обновление до альтернативного решения с эквивалентными байтами.
Патрик Робертс

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 почти всегда меньше байтов, чем написание функции, поскольку отступы являются обязательной частью синтаксиса.
Патрик Робертс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.