Causa la massima interruzione di un sondaggio di paglia


9

Contesto

Straw Poll è un sito Web pensato per la creazione di sondaggi semplici / informali. Fornito con un elenco di opzioni, l'utente può selezionare le proprie scelte e i voti vengono conteggiati. Ci sono due caratteristiche molto importanti di un sondaggio di paglia:

  • È possibile visualizzare i risultati attuali prima di votare
  • Spesso è possibile selezionare più opzioni, che vengono trattate come se si votasse più volte, una per ogni opzione.

L'unica cosa più divertente che fare Straw Polls è fare casino con i risultati. Esistono due tipi principali di interruzione:

  • Interruzione semplice, in cui si vota per tutte le opzioni
  • Interruzione avanzata, in cui scegli strategicamente quali opzioni votare per massimizzare l'effetto.

In questa sfida, scriverai un programma per l' interruzione avanzata .

La matematica

Semplicemente matematicamente, possiamo dire che maggiore è l'entropia dei voti, più un sondaggio è interrotto. Ciò significa che un sondaggio in cui una singola opzione ha tutti i voti non viene affatto interrotto, mentre un sondaggio in cui ogni opzione ha un numero uguale di voti viene interrotto al massimo (essendo questo l'obiettivo finale).

L'entropia di un elenco di numeri [x1, x2, ..., xn]è data dalla seguente equazione di Wikipedia. P(xi)è la probabilità di xi, che è xi / total_num_of_votes. Se un'opzione ha ricevuto zero voti finora, semplicemente non è inclusa nella somma (per evitare log(0)). Per i nostri scopi, il logaritmo può trovarsi in qualsiasi base di vostra scelta.

inserisci qui la descrizione dell'immagine

Ad esempio, l'entropia di [3,2,1,1]è approssimativamente 1.277, usando la base e .

Il prossimo passo è determinare quale modello di voto porta al maggior aumento di entropia. Posso votare qualsiasi sottoinsieme di opzioni, quindi ad esempio il mio voto potrebbe essere [1,0,1,0]. Se questi fossero i miei voti, allora il conteggio finale è [4,2,2,1]. Ricalcolare l'entropia dà 1.273, dando una diminuzione dell'entropia, il che significa che questo è un terribile tentativo di interruzione. Ecco alcune altre opzioni:

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

Da ciò, possiamo concludere che il modello di voto ottimale è [0,0,1,1]dato che dà il maggior aumento di entropia.

Ingresso

L'input è un elenco non vuoto di numeri interi non crescenti e non negativi. Gli esempi includono [3,3,2,1,0,0], [123,23,1]o addirittura [4]. È consentito qualsiasi formato ragionevole.

Produzione

L'output è un elenco (della stessa lunghezza dell'input) di valori di verità e falsità, in cui le verità rappresentano le opzioni per le quali dovrei votare se volessi causare la massima perturbazione. Se più di un modello di voto fornisce la stessa entropia, si può produrre uno di essi.

Criterio vincente

Questo è code-golf, meno byte sono meglio.

Casi test

[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)

Mi chiedo cosa succederebbe se volessimo ridurre l' entropia.
Calcolatrice

1
I casi di test sembrano coerenti con l'euristica "Aumenta i valori inferiori alla media". Potresti includere alcuni casi di test più complicati?
xnor

@xnor dato che l'entropia è massimizzata con una distribuzione uniforme, sarà una buona euristica! In effetti, potrebbe anche essere sempre la strategia ottimale .. Forse qualcuno può pensare a un buon caso limite?
A Simmons

Risposte:


3

Mathematica, 19 44 byte

... (lamentandosi forte)

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

Test:

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

Questo non riesce per {100,50,1,1}dove ritorna {False, False, True, True}, con conseguente entropia di 0.758. {False, True, True, True}produce un'entropia di 0.761.
IPoiler,

@IPoiler grazie per aver trovato quella testcase.
PhiNotPi

1
(piange e muore)
Calcolatrice

2
Per qui Questo dovrebbe essere eliminato.
Rɪᴋᴇʀ

1
..Fisso. (lamentarsi più forte)
CalculatorFeline


1

MATL , 24 byte

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

Funziona con la versione 13.0.0 del linguaggio / compilatore, che è precedente alla sfida.

Provalo online!

Spiegazione

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

Esempio

Ecco un esempio di come funziona. Per l'input [3 2 2], l'array di possibili schemi di voto (prodotto da 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 ]

dove ogni riga è un modello. Questo viene aggiunto all'originale [3 2 0]con broadcast ( G+). Ciò significa che i tempi [3 2 0]vengono replicati 8verticalmente e quindi aggiunti in termini di elementi per dare

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

Questo viene trasposto e ogni colonna è divisa per ogni somma ( !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 ]

Moltiplicando per il suo logaritmo e sommando ogni colonna ( tYl*s) si ottiene meno l'entropia:

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

La meno entropia è minimizzata ( 4#X<) dal 4modello del voto, che corrisponde ( Y)) al risultato finale[0 1 1] .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.