Gây ra sự gián đoạn tối đa cho một cuộc thăm dò rơm


9

Bối cảnh

Straw Poll là một trang web dành cho việc tạo ra các cuộc thăm dò đơn giản / không chính thức. Được cung cấp một danh sách các tùy chọn, người dùng có thể chọn (các) lựa chọn của họ và số phiếu được kiểm tra. Có hai đặc điểm rất quan trọng của Cuộc thăm dò rơm:

  • Có thể xem kết quả hiện tại trước khi bỏ phiếu
  • Thường có thể chọn nhiều tùy chọn, được xử lý theo cùng một cách như thể bạn đã bỏ phiếu nhiều lần, một cho mỗi tùy chọn.

Một điều thú vị hơn là làm Straw Polls là kết quả lộn xộn. Có hai loại gián đoạn chính:

  • Sự gián đoạn đơn giản, trong đó bạn bỏ phiếu cho tất cả các tùy chọn
  • Sự gián đoạn nâng cao, trong đó bạn có chiến lược chọn các tùy chọn để bỏ phiếu để tối đa hóa hiệu quả.

Trong thử thách này, bạn sẽ viết một chương trình cho sự gián đoạn nâng cao .

Toán

Nói một cách đơn giản về mặt toán học, chúng ta có thể nói rằng entropy của phiếu bầu càng cao, cuộc thăm dò càng bị phá vỡ. Điều này có nghĩa là một cuộc thăm dò trong đó một lựa chọn duy nhất có tất cả các phiếu bầu không bị phá vỡ, trong khi một cuộc thăm dò trong đó mọi lựa chọn có số phiếu bằng nhau đều bị phá vỡ tối đa (đây là mục tiêu cuối cùng).

Entropy của một danh sách các số [x1, x2, ..., xn]được đưa ra bởi phương trình sau từ wikipedia. P(xi)là xác suất của xi, đó là xi / total_num_of_votes. Nếu một tùy chọn đã nhận được 0 phiếu cho đến nay, thì đơn giản là nó không được bao gồm trong tổng kết (để tránh log(0)). Đối với mục đích của chúng tôi, logarit có thể nằm trong bất kỳ cơ sở nào bạn chọn.

nhập mô tả hình ảnh ở đây

Ví dụ, entropy của [3,2,1,1]xấp xỉ 1.277, sử dụng cơ sở e .

Bước tiếp theo là xác định mô hình bỏ phiếu nào dẫn đến sự gia tăng lớn nhất của entropy. Tôi có thể bỏ phiếu cho bất kỳ tập hợp con các tùy chọn, vì vậy, ví dụ như phiếu bầu của tôi có thể [1,0,1,0]. Nếu đây là phiếu bầu của tôi, thì cuộc kiểm đếm cuối cùng là [4,2,2,1]. Tính toán lại entropy đưa ra 1.273, làm giảm entropy, có nghĩa đây là một nỗ lực khủng khiếp để phá vỡ. Dưới đây là một số tùy chọn khác:

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

Từ điều này, chúng ta có thể kết luận rằng mô hình bỏ phiếu tối ưu[0,0,1,1]vì nó mang lại sự gia tăng lớn nhất về entropy.

Đầu vào

Đầu vào là một danh sách không trống của các số nguyên không tăng, không âm. Ví dụ như [3,3,2,1,0,0], [123,23,1]hoặc thậm chí [4]. Bất kỳ định dạng hợp lý đều được phép.

Đầu ra

Đầu ra là một danh sách (cùng độ dài với đầu vào) của các giá trị trung thực và falsey, trong đó các sự thật đại diện cho các tùy chọn mà tôi nên bỏ phiếu nếu tôi muốn gây ra sự gián đoạn tối đa. Nếu có nhiều mẫu biểu quyết cho cùng một kiểu entropy, thì một mẫu có thể là đầu ra.

Tiêu chí chiến thắng

Đây là mã golf, ít byte hơn là tốt hơn.

Các trường hợp thử nghiệm

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

Tôi tự hỏi điều gì sẽ xảy ra nếu chúng ta muốn giảm entropy.
Máy

1
Các trường hợp thử nghiệm dường như phù hợp với phương pháp heuristic "Tăng các giá trị dưới trung bình". Bạn có thể bao gồm một số trường hợp thử nghiệm khó khăn hơn?
xnor

@xnor cho rằng entropy được tối đa hóa với phân phối đồng đều, đó sẽ là một heuristic tốt! Trong thực tế, nó thậm chí có thể luôn luôn là chiến lược tối ưu .. Có lẽ ai đó có thể nghĩ về một trường hợp cạnh tốt?
Một Simmons

Câu trả lời:


3

Toán học, 19 44 byte

... (phàn nàn lớn)

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

Kiểm tra:

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

Điều này không thành công cho {100,50,1,1}nơi nó trở lại {False, False, True, True}, dẫn đến một entropy của 0.758. {False, True, True, True}mang lại một entropy của 0.761.
IPoiler

@IPoiler cảm ơn vì đã tìm thấy testcase đó.
PhiNotPi

1
(khóc và chết)
Máy

2
Mỗi ở đây Điều này nên được xóa.
Rɪᴋᴇʀ

1
..Đã sửa. (phàn nàn nhiều hơn)
Máy


1

MATL , 24 byte

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

Điều này hoạt động với phiên bản 13.0.0 của ngôn ngữ / trình biên dịch, sớm hơn so với thử thách.

Hãy thử trực tuyến!

Giải trình

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

Thí dụ

Đây là một ví dụ về cách nó hoạt động. Đối với đầu vào [3 2 2], mảng các mẫu biểu quyết có thể (được tạo bởi Z^) là

[ 0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1 ]

trong đó mỗi hàng là một mẫu. Điều này được thêm vào bản gốc [3 2 0]với Broadcast ( G+). Điều đó có nghĩa [3 2 0]là nhân rộng 8thời gian theo chiều dọc và sau đó thêm yếu tố khôn ngoan để cung cấp

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

Điều này được hoán vị và mỗi cột được chia cho mỗi tổng ( !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 ]

Nhân với logarit của nó và tính tổng mỗi cột ( tYl*s) sẽ trừ đi entropy:

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

Điểm trừ entropy được thu nhỏ ( 4#X<) theo 4mẫu phiếu bầu, tương ứng ( Y)) với kết quả cuối cùng[0 1 1] .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.