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)
