밀짚 조사에 최대의 방해를 일으킴


9

문맥

Straw Poll 은 단순 / 비공식 여론 조사를위한 웹 사이트입니다. 옵션 목록이 제공되면 사용자는 선택 사항을 선택할 수 있고 투표가 집계됩니다. 밀짚 설문 조사에는 두 가지 중요한 기능이 있습니다.

  • 투표하기 전에 현재 결과를 볼 수 있습니다
  • 여러 옵션을 선택하는 것이 종종 가능하며, 각 옵션마다 하나씩 여러 번 투표 한 것과 같은 방식으로 처리됩니다.

밀짚 설문 조사를 만드는 것보다 더 재미있는 것은 결과를 망쳐 놓는 것입니다. 두 가지 주요 유형의 중단이 있습니다.

  • 모든 옵션에 투표하는 간단한 중단
  • 효과를 극대화하기 위해 투표 할 옵션을 전략적으로 선택하는 고급 중단.

이 도전에서는 고급 중단을 위한 프로그램을 작성하게됩니다 .

수학

수학적으로 간단히 말하면 투표의 엔트로피가 높을수록 설문 조사가 더 중단 되었다고 말할 수 있습니다 . 즉, 단일 옵션이 모든 투표를 갖는 투표는 전혀 중단되지 않고 모든 옵션이 동일한 투표 수를 갖는 투표는 최대로 중단됩니다 (이것이 궁극적 인 목표입니다).

숫자 목록의 엔트로피는 [x1, x2, ..., xn]Wikipedia의 다음 방정식으로 제공됩니다. P(xi)의 확률 xi이다 xi / total_num_of_votes. 옵션이 지금까지 0 표를받지 못했다면, 간단히 피하기 위해 합계에 포함되지 않습니다 log(0). 우리의 목적을 위해, 로그는 당신이 선택한 어떤 기반이든 될 수 있습니다.

여기에 이미지 설명을 입력하십시오

예를 들어,의 엔트로피 [3,2,1,1]는 대략 e를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

매스 매 티카, 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

테스트 케이스를 찾아 주셔서 감사합니다.
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] 해당합니다 ( ) .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.