Tôi đã từng cần phải viết một hàm tính toán entropy khối của một chuỗi ký hiệu nhất định cho một kích thước khối nhất định và rất ngạc nhiên khi kết quả ngắn như thế nào. Vì vậy, tôi đang thách thức bạn để codegolf một chức năng như vậy. Tôi không nói cho bạn biết tôi đã làm gì bây giờ (và bằng ngôn ngữ nào), nhưng tôi sẽ trong một tuần hoặc lâu hơn, nếu không ai nghĩ ra ý tưởng tương tự hoặc tốt hơn trước.
Định nghĩa của entropy khối:
Cho một chuỗi ký hiệu A = A_1, Mạnh, A_n và kích thước khối m:
- Một khối có kích thước m là một phân đoạn gồm các phần tử m liên tiếp của chuỗi ký hiệu, nghĩa là A_i, Vượt, A_ (i + m 1) cho bất kỳ i thích hợp nào.
- Nếu x là một chuỗi ký hiệu có kích thước m, N (x) biểu thị số khối của A giống hệt với x.
- p (x) là xác suất để một khối từ A giống hệt với chuỗi ký hiệu x có kích thước m, tức là p (x) = N (x) / (n m + 1)
- Cuối cùng, entropy khối cho kích thước khối m của A là trung bình của −log (p (x)) trên tất cả các khối x có kích thước m trong A hoặc (tương đương) tổng của −p (x) · log (p (x)) trên mỗi x kích thước m xảy ra ở A. (Bạn có thể chọn bất kỳ logarit hợp lý nào bạn muốn.)
Hạn chế và làm rõ:
- Hàm của bạn sẽ lấy chuỗi ký hiệu A cũng như kích thước khối m làm đối số.
- Bạn có thể giả sử rằng các ký hiệu được biểu diễn dưới dạng số nguyên dựa trên số 0 hoặc ở định dạng thuận tiện khác.
- Chương trình của bạn phải có khả năng đưa ra bất kỳ đối số hợp lý nào trong lý thuyết và trong thực tế sẽ có thể tính toán trường hợp ví dụ (xem bên dưới) trên một máy tính tiêu chuẩn.
- Các hàm và thư viện tích hợp được cho phép, miễn là chúng không thực hiện các phần lớn của quy trình trong một cuộc gọi, nghĩa là trích xuất tất cả các khối có kích thước m từ A, đếm số lần xuất hiện của một khối x cho trước hoặc tính toán các entropi từ một chuỗi các giá trị p - bạn phải tự làm những việc đó.
Kiểm tra:
[2, 3, 4, 1, 2, 3, 0, 0, 3, 2, 3, 0, 2, 2, 4, 4, 4, 1, 1, 1, 0, 4, 1,
2, 2, 4, 0, 1, 2, 3, 0, 2, 3, 2, 3, 2, 0, 1, 3, 4, 4, 0, 2, 1, 4, 3,
0, 2, 4, 1, 0, 4, 0, 0, 2, 2, 0, 2, 3, 0, 0, 4, 4, 2, 3, 1, 3, 1, 1,
3, 1, 3, 1, 0, 0, 2, 2, 4, 0, 3, 2, 2, 3, 0, 3, 3, 0, 0, 4, 4, 1, 0,
2, 3, 0, 0, 1, 4, 4, 3]
Các entropies khối đầu tiên của chuỗi này là (đối với logarit tự nhiên):
- m = 1: 1,599
- m = 2: 3.065
- m = 3: 4.067
- m = 4: 4.412
- m = 5: 4,535
- m = 6: 4.554
entropy(probabilities(blocks(A,m))).