Учитывая список населения каждого штата, выведите, от наибольшего до наименьшего, количество голосов, которые штат получает в коллегии выборщиков.
Вход: первое число представляет общее количество голосов для распределения; за ним следует список и населения. В этом примере используются сокращения для состояний, но можно использовать любое имя, содержащее заглавные и строчные буквы. Вы можете взять это в любом формате, который вам нравится, если в нем содержится только информация о штате и его население.
Входные данные могут быть приняты в качестве аргументов функции или любым другим способом.
Пример (возможный) ввод: 538 [[CA 38000000], [NH 1300000] etc.]
Вывод: Выведите в каком-либо формате количество голосов, которое получает каждый штат. Порядок состояний от наибольшего к наименьшему. Если два состояния имеют одинаковое количество голосов, порядок по тому, какое имя будет первым в словаре (который идет в алфавитном порядке).
Прежде чем определить количество голосов, сначала проверьте, есть ли в списке входов штат с именем DC, и, если таковой имеется, дайте этому штату 3 голоса, независимо от его населения. Затем удалите его из списка и назначьте остальные голоса, как если бы DC не существовал.
Количество голосов в коллегии выборщиков определяется как сумма числа сенаторов и представителей. Каждое государство получает двух сенаторов, поэтому для получения количества представителей вычтите удвоенное количество штатов из общего числа (538 в примере ввода). Назначьте каждому штату одного представителя для начала. Затем выполните следующий процесс:
Присвойте каждому штату число,
A
определенное какP/sqrt(2)
гдеP
находится население.Сортировать состояния в соответствии с их значениями
A
.Присвойте первому состоянию (одному с наибольшим
A
) еще одного представителя.Переназначить значения
A
, какA = P/(sqrt(n)*sqrt(n + 1))
, гдеn
находится текущее количество представителей, назначенных государству.Вернитесь к шагу 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
текущее число представителей, назначенных для государства.». Это сбило меня с толку.Ответы:
Чистый ,
263244222 байтаЗвоните как
Ungolfed версия, полная программа (
census.icl
):источник
JavaScript ES6,
249 байтов,244 байтаКонтрольные примеры
Благодарим @Neil за сохранение 5 байт!
источник
.some((t,i)=>t.a=t.p/q(++t.r)/q(t.r+1))
сэкономит вам байт, если он работает.r
увеличивается каждый раз..some
и нет.map
.i
. Ницца!Python 2, 219 байт
Принимает вход как
Печать:
источник