Введение
Учитывая набор процентных вариантов в опросе, подсчитайте минимальное число избирателей, которое должно быть в опросе, чтобы сгенерировать эту статистику.
Пример: какой ваш любимый питомец?
- Собака:
44.4%
- Кот:
44.4%
- Мышь:
11.1%
Выход: 9
(минимально возможное число избирателей)
Спекуляции
Вот требования к вашей программе / функции:
- В качестве входных данных вы получаете массив значений в процентах (для стандартного ввода, в качестве аргумента функции и т. Д.).
- Каждое процентное значение представляет собой число, округленное до одного десятичного знака (например,
44.4 44.4 11.1
). - Вычислите минимально возможное число избирателей в опросе, результаты которых позволят получить эти точные проценты при округлении до одного знака после запятой (по стандартному выводу или возвращаемому значению функции).
- Бонус : -15 символов, если вы можете решить «нетривиальным» способом (то есть, не включает в себя итерацию по каждому возможному числу избирателей, пока вы не найдете первый, который работает)
пример
>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401
счет
Это код-гольф, поэтому выигрывают самые короткие персонажи. Любые бонусы вычитаются из общего количества персонажей.
code-golf
math
reverse-engineering
mellamokb
источник
источник
26.7 53.3 20.0
(4 8 3 из 15),48.4 13.7 21.6 6.5 9.8
(74 21 33 10 15 из 153) и т. Д.0.5%
суммы итога, и каждый раз, когда происходит округление, вы складываете сумму до0.5%
суммы. Последние четыре контрольных примера были специально созданы для оптимального использования этого явления. В первом тестовом примере, который заканчивается2000
, каждая из первых 9 записей представляет1
голос (и все округляются в0.5%
большую сторону), тогда как последняя представляет1991
голоса (и округляется в меньшую сторону ~0.5%
). Если вы посчитаете эти проценты вручную и округлите до 1 десятичного знака, вы увидите, что все они верны.Ответы:
APL (Дьялог Классик) ,
4843 байта-5 байт от Адама
Полная программа ввода от стандартного ввода.
Попробуйте онлайн!Ссылка на версию DFN.
Ungolfed
Попробуйте онлайн!
normalize
делит (÷
) все элементы своего правого аргумента (⊢
) на сумму (+/
).round(y)
округляет y до 3 знаков после запятой форматированием (⍕
) и затем вычислением (⍎
) каждый элемент из y.find_max(y)
возвращает массив с 1, где max (y) найдено и 0 в другом месте.increase(x,y)
берет x (целевые проценты) и y (массив текущих итогов голосования) и вычисляет, куда добавить 1 в y, чтобы приблизить проценты к x.vote_totals(x,y)
берет x (целевые проценты) и y (начальные итоги голосования) и выполняет f повторно, добавляя голоса до округления процентов до x.f ⍣ g
означает выполнятьf
несколько раз, пока неg(y,f(y))
станет истиной. В этом случае мы игнорируемf(y)
.h(x)
устанавливает y в 0 (эквивалентно массиву 0 с из-за векторизации), выполняет g и суммирует итоговые итоги голосования.источник
Питон, 154
Теперь это работает для последнего примера.
Пример работы:
источник
99.1
в виду последнее значение1/2000 = 0.05%
(0.1%
округлено) и1991/2000 = 99.55%
(99.6%
округлено). Так что, если в опросе есть десять вариантов, и за них проголосуют девять из них, в то время как последний получит голоса 1991 года, тогда он даст эти проценты.J, 57 знаков
Использовал тривиальный метод. Требуется ввод с клавиатуры.
t
создает таблицу поиска, а вторая строка ищет входные данные в таблице. Я могу предоставить расширенное объяснение кода, если кому-то интересно.Я рассмотрел использование процента для создания дроби, а затем получил наименьшую форму дроби, чтобы вычислить число, но я не мог найти способ заставить его работать с округлением результатов.
источник
Питон, 154
источник
[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]
?1/2000 = 0.05%
(0.1%
округлено) и1991/2000 = 99.55%
(99.6%
округлено). Так что на самом деле это 100%, но округление делает это действительно запутанным.VBA - 541
В этом есть некоторые явные ошибки, но это была моя попытка найти нетривиальное решение, пока я не получу правильное число. Я не полностью играл в гольф, хотя я не думаю, что есть что добавить в этом отношении. Однако я потратил слишком много времени на это, и сейчас у меня болит голова. Не говоря уже о том, что правила, вероятно, очень нарушены и применяются более или менее только к этим примерам.
Это очень хорошо подходит для многих простых тестов, которые я выполнял (т. Е. Даже для итогов, 2 или 3 входных данных), но не проходит для некоторых тестов, представленных в ходе испытания. Тем не менее, я обнаружил, что если вы увеличите десятичную точность ввода (вне рамок задачи), точность улучшится.
Большая часть работы включает в себя поиск gcd для набора предоставленных чисел, и я вроде как справился с этим
Function g()
, хотя он, безусловно, неполон и, вероятно, является источником по крайней мере некоторых ошибок в моих выходных данных.Ввод - это строка значений, разделенных пробелами.
Тестовые случаи (входные данные ==> ожидаемые / возвращаемые):
источник
Debug.Print
вDebug.?
C # (.NET Core) , 286 байт
Попробуйте онлайн!
Сохранено много байтов благодаря Питеру Тейлору и Embodiment of Ignorance
источник
}
в конце.Zip
метод Linq .1>0
как корочеtrue
, это предпочтительно.Python 3 ,
140139137 байтПопробуйте онлайн!
Дает правильный ответ для первых двух тестовых случаев и выходит за пределы рекурсии Python для остальных. Это не очень удивительно, поскольку каждая проверка выполняется на новом уровне рекурсии. Это коротко, хотя ...
(Объяснение используемых переменных можно найти в ссылке TIO)
должен работать на 136 байтов, но не из-за точности с плавающей точкой.
источник