Вызывает максимальное нарушение в опросе соломы


9

контекст

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)

Интересно, что произойдет, если мы захотим уменьшить энтропию.
CalculatorFeline

1
Тестовые случаи, похоже, согласуются с эвристическим «Увеличением значений ниже среднего». Не могли бы вы включить несколько более сложных тестовых случаев?
xnor

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

Ответы:


3

Mathematica, 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]с broadcast ( 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.