контекст
Straw Poll - это веб-сайт, предназначенный для создания простых / неформальных опросов. Предоставленный список вариантов, пользователь может выбрать свой выбор, и голоса подсчитываются. Есть две очень важные особенности опроса соломы:
- Текущие результаты можно посмотреть до голосования
- Часто можно выбрать несколько вариантов, которые рассматриваются так же, как если бы вы проголосовали несколько раз, по одному для каждого варианта.
Единственная вещь, которая более интересна, чем создание Straw Опросы - это шутка с результатами. Есть два основных типа нарушения:
- Простое нарушение, при котором вы голосуете за все варианты
- Расширенное нарушение, при котором вы стратегически выбираете, за какие варианты голосовать, чтобы максимизировать эффект.
В этом задании вы напишете программу для продвинутых сбоев.
Математика
Проще говоря, математически, мы можем сказать, что чем выше энтропия голосов, тем более нарушен опрос. Это означает, что опрос, в котором один вариант имеет все голоса, вообще не прерывается, а опрос, в котором каждый вариант имеет равное количество голосов, максимально прерывается (это и является конечной целью).
Энтропия списка чисел [x1, x2, ..., xn]
определяется следующим уравнением из Википедии. P(xi)
вероятность того xi
, что есть xi / total_num_of_votes
. Если опцион до сих пор получил ноль голосов, он просто не включается в суммирование (чтобы избежать log(0)
). Для наших целей логарифм может быть в любой базе на ваш выбор.
В качестве примера, энтропия [3,2,1,1]
составляет примерно 1.277
, используя базу е .
Следующим шагом является определение того, какой шаблон голосования приведет к наибольшему увеличению энтропии. Я могу голосовать за любое подмножество вариантов, так, например, мой голос может быть [1,0,1,0]
. Если бы это были мои голоса, то итоговый счет [4,2,2,1]
. Пересчет энтропии дает 1.273
, давая уменьшение энтропии, что означает, что это ужасная попытка разрушения. Вот еще несколько вариантов:
don't vote
[3,2,1,1] -> 1.277
vote for everything
[4,3,2,2] -> 1.342
vote for the 1s
[3,2,2,2] -> 1.369
vote for the 2 and 1s
[3,3,2,2] -> 1.366
Исходя из этого, мы можем сделать вывод, что оптимальным является шаблон голосования,[0,0,1,1]
поскольку он дает наибольшее увеличение энтропии.
вход
Входные данные - это непустой список нерастущих, неотрицательных целых чисел. Примеры включают в себя [3,3,2,1,0,0]
, [123,23,1]
или даже [4]
. Любой разумный формат допустим.
Вывод
Выходные данные - это список (такой же длины, что и входные данные) значений истинности и ложности, где истины представляют варианты, за которые я должен проголосовать, если я хочу вызвать максимальное нарушение. Если более одного шаблона голосования дают одинаковую энтропию, может быть выведен любой из них.
Критерий победы
Это код-гольф, чем меньше байтов, тем лучше.
Тестовые случаи
[3,2,1,1] -> [0,0,1,1] (from 1.227 to 1.369)
[3,3,2,1,0,0] -> [0,0,0,1,1,1] (from 1.311 to 1.705)
[123,23,1] -> [0,1,1] (from 0.473 to 0.510)
[4] -> [0] OR [1] (from 0 to 0)
[7,7,6,6,5] -> [0,0,1,1,1] (from 1.602 to 1.608)
[100,50,1,1] -> [0,1,1,1] (from 0.707 to 0.761)