Спричиняйте максимальне порушення солом'яного опитування


9

Контекст

Солом’яне опитування - це веб-сайт, який призначений для створення простих / неформальних опитувань. За допомогою переліку варіантів користувач може обрати свій вибір (и), і голоси підсумовуються. Є дві дуже важливі особливості опитування соломки:

  • Попередні результати можна переглянути перед голосуванням
  • Часто можна вибрати кілька варіантів, які трактуються так само, як якщо б ви проголосували кілька разів, по одному за кожен варіант.

Єдине, що цікавіше, ніж проведення солом’яних опитувань - це псує результати. Є два основні типи зривів:

  • Простий зрив, при якому ви голосуєте за всі варіанти
  • Розширений зрив, коли ви стратегічно вибираєте, за які варіанти голосувати, щоб досягти максимального ефекту.

У цьому виклику ви напишете програму для розширених збоїв.

Математика

Якщо говорити математично, ми можемо сказати, що чим вище ентропія голосів, тим більше порушене опитування. Це означає, що опитування, в якому за один варіант мають всі голоси, взагалі не порушується, тоді як опитування, де кожна опція має рівну кількість голосів, максимально порушена (це є кінцевою метою).

Ентропія списку чисел [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)

Цікаво, що буде, якби ми хотіли зменшити ентропію.
CalculatorFeline

1
Схоже, тестові випадки узгоджуються з евристичним "Підвищення нижче середніх значень". Не могли б ви включити деякі складніші тестові випадки?
xnor

@xnor, враховуючи, що ентропія максимізована рівномірним розподілом, це буде хорошою евристикою! Насправді це може бути завжди завжди оптимальною стратегією. Можливо, хтось може придумати гарний кращий випадок?
Сіммонс

Відповіді:


3

Математика, 19 44 байти

... (голосно скаржиться)

(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&

Тест:

{Test, data, goes, here};
(x=Median@#[[;;Mod[Length@#,2]-3]];#≤x&/@#)&
%%+Boole/@%

Це не вдається, {100,50,1,1}де він повертається {False, False, True, True}, що призводить до ентропії 0.758. {False, True, True, True}дає ентропію 0.761.
IPoiler

Дякуємо @IPoiler за те, що знайшли цей тестовий зразок
PhiNotPi

1
(плаче і вмирає)
CalculatorFeline

2
Ось тут Це слід видалити.
Rɪᴋᴇʀ

1
..Фікс. (голосніше скаржиться)
CalculatorFeline


1

MATL , 24 байти

FTinZ^tG+!ts/tYl*s4#X<Y)

Це працює з мовою / компілятором версії 13.0.0 , що є раніше, ніж виклик.

Спробуйте в Інтернеті!

Пояснення

FT        % array [0 1]
in        % take input and push its length
Z^        % Cartesian power. This gives all possible vote patterns, each on a row
t         % duplicate (will be indexed into at the end to produce the result)
G         % push input again
+         % element-wise addition with broadcast
!         % transpose
ts/       % duplicate. Divide each column by its sum
tYl       % duplicatte. Take natural logarithm
*         % element-wise multiplication
s         % sum of each column. Gives minus entropy produce by each vote pattern
4#X<      % arg max
Y)        % index into original array of voting patterns. Implicitly display

Приклад

Ось приклад того, як це працює. Для введення [3 2 2]є масив можливих шаблонів голосування (створений Z^)

[ 0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1 ]

де кожен ряд є візерунком. Це додано до оригіналу за [3 2 0]допомогою мовлення ( G+). Це означає [3 2 0], що 8раз повторюється вертикально, а потім додається елемент, який мусить дати

[ 3 2 2
  3 2 3
  3 3 2
  3 3 3
  4 2 2
  4 2 3
  4 3 2
  4 3 3 ]

Це переміщується, і кожен стовпець ділиться на кожну суму ( !ts/):

[ 0.4286    0.3750    0.3750    0.3333    0.5000    0.4444    0.4444    0.4000
  0.2857    0.2500    0.3750    0.3333    0.2500    0.2222    0.3333    0.3000
  0.2857    0.3750    0.2500    0.3333    0.2500    0.3333    0.2222    0.3000 ]

Помноження на його логарифм та підсумовування кожного стовпця ( tYl*s) дає мінус ентропії:

[ -1.0790   -1.0822   -1.0822   -1.0986   -1.0397   -1.0609   -1.0609   -1.0889 ]

Мінус ентропії мінімізується ( 4#X<) за 4схемою голосування, що відповідає ( Y)) кінцевому результату[0 1 1] .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.