Contexto
O Straw Poll é um site destinado à criação de pesquisas simples / informais. Fornecido com uma lista de opções, o usuário pode selecionar suas opções e os votos são computados. Há duas características muito importantes de uma pesquisa de palha:
- É possível visualizar os resultados atuais antes da votação
- Geralmente, é possível selecionar várias opções, que são tratadas da mesma maneira como se você votasse várias vezes, uma para cada opção.
A única coisa mais divertida do que fazer pesquisas de palha é mexer nos resultados. Existem dois tipos principais de interrupção:
- Interrupção simples, na qual você vota em todas as opções
- Interrupção avançada, na qual você escolhe estrategicamente em quais opções votar para maximizar o efeito.
Neste desafio, você escreverá um programa para interrupções avançadas .
A matemática
Para simplificar as coisas matematicamente, podemos dizer que quanto maior a entropia dos votos, mais prejudicada é a votação. Isso significa que uma pesquisa em que uma única opção tem todos os votos não é interrompida, enquanto uma pesquisa em que cada opção tem um número igual de votos é interrompida ao máximo (sendo esse o objetivo final).
A entropia de uma lista de números [x1, x2, ..., xn]
é dada pela seguinte equação da wikipedia. P(xi)
é a probabilidade de xi
, qual é xi / total_num_of_votes
. Se uma opção recebeu zero voto até agora, ela simplesmente não está incluída no somatório (para evitar log(0)
). Para nossos propósitos, o logaritmo pode estar em qualquer base de sua escolha.
Como exemplo, a entropia de [3,2,1,1]
é aproximadamente 1.277
, usando a base e .
O próximo passo é determinar qual padrão de votação leva ao maior aumento na entropia. Posso votar em qualquer subconjunto de opções, por exemplo, meu voto poderia ser [1,0,1,0]
. Se esses foram meus votos, então a contagem final é [4,2,2,1]
. Recalcular a entropia dá 1.273
, dando uma diminuição na entropia, o que significa que esta é uma terrível tentativa de interrupção. Aqui estão algumas outras opções:
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
A partir disso, podemos concluir que o padrão ótimo de votação é [0,0,1,1]
uma vez que proporciona o maior aumento na entropia.
Entrada
Entrada é uma lista não vazia de números inteiros não crescentes e não negativos. Exemplos incluem [3,3,2,1,0,0]
, [123,23,1]
, ou mesmo [4]
. Qualquer formato razoável é permitido.
Resultado
A saída é uma lista (do mesmo tamanho que a entrada) de valores de verdade e falsey, em que as verdades representam as opções pelas quais devo votar se desejar causar a interrupção máxima. Se mais de um padrão de votação der a mesma entropia, qualquer um poderá ser emitido.
Critério vencedor
Isso é código-golfe, menos bytes são melhores.
Casos de teste
[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)
Respostas:
Mathematica,
1944 bytes... (alto reclamando)
Teste:
fonte
{100,50,1,1}
onde retorna{False, False, True, True}
, resultando em uma entropia de0.758
.{False, True, True, True}
produz uma entropia de0.761
.Pitão - 25 bytes
Conjunto de Teste .
fonte
MATL , 24 bytes
Isso funciona com a versão 13.0.0 do idioma / compilador, anterior ao desafio.
Experimente online!
Explicação
Exemplo
Aqui está um exemplo de como isso funciona. Para entrada
[3 2 2]
, a matriz de possíveis padrões de votação (produzidos porZ^
) éonde cada linha é um padrão. Isso é adicionado ao original
[3 2 0]
com broadcast (G+
). Isso significa que[3 2 0]
é replicado8
vezes verticalmente e depois adicionado elemento a elemento para fornecerIsso é transposto e cada coluna é dividida por cada soma (
!ts/
):Multiplicar por seu logaritmo e somar cada coluna (
tYl*s
) fornece menos a entropia:A entropia negativa é minimizada (
4#X<
) pelo4
padrão do voto th, que corresponde (Y)
) ao resultado final[0 1 1]
.fonte