Контекст
Солом’яне опитування - це веб-сайт, який призначений для створення простих / неформальних опитувань. За допомогою переліку варіантів користувач може обрати свій вибір (и), і голоси підсумовуються. Є дві дуже важливі особливості опитування соломки:
- Попередні результати можна переглянути перед голосуванням
- Часто можна вибрати кілька варіантів, які трактуються так само, як якщо б ви проголосували кілька разів, по одному за кожен варіант.
Єдине, що цікавіше, ніж проведення солом’яних опитувань - це псує результати. Є два основні типи зривів:
- Простий зрив, при якому ви голосуєте за всі варіанти
- Розширений зрив, коли ви стратегічно вибираєте, за які варіанти голосувати, щоб досягти максимального ефекту.
У цьому виклику ви напишете програму для розширених збоїв.
Математика
Якщо говорити математично, ми можемо сказати, що чим вище ентропія голосів, тим більше порушене опитування. Це означає, що опитування, в якому за один варіант мають всі голоси, взагалі не порушується, тоді як опитування, де кожна опція має рівну кількість голосів, максимально порушена (це є кінцевою метою).
Ентропія списку чисел [x1, x2, ..., xn]
задається наступним рівнянням з Вікіпедії. P(xi)
є ймовірність xi
, яка є xi / total_num_of_votes
. Якщо варіант досі отримав нульові голоси, він просто не включається до підсумків (щоб уникнути log(0)
). Для наших цілей логарифм може бути в будь-якій вашій базі.
Як приклад, ентропія [3,2,1,1]
приблизно 1.277
, з використанням бази e .
Наступним кроком є визначення того, яка схема голосування призводить до найбільшого зростання ентропії. Я можу проголосувати за будь-яку підмножину варіантів, тому, наприклад, мій голос може бути [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]
. Допустимий будь-який розумний формат.
Вихідні дані
Вихід - це список (такий же довжина, що і введення) значень "truthy" і "falsey", де істини представляють варіанти, за які я повинен проголосувати, якщо бажаю викликати максимальний зрив. Якщо більше одного шаблону голосування дає одну і ту ж ентропію, можна вивести будь-яку.
Критерій виграшу
Це код-гольф, менше байтів краще.
Випробування
[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)