Và đặc biệt là định luật thứ hai : entropy của một hệ cô lập tăng theo thời gian .
Đối với thử thách này,
- Một " hệ thống biệt lập " sẽ được coi là một chương trình hoặc chức năng (viết tắt là "chương trình" từ bây giờ);
- Thời gian trôi qua " thời gian " sẽ tương ứng với các lần thực hiện lặp lại của đầu ra của chương trình , được coi là một chương trình mới;
- " Entropy " sẽ được coi là entropy bậc nhất của Shannon (sẽ được xác định bên dưới), đây là thước đo mức độ đa dạng của các ký tự của chuỗi.
Các thách thức
Chương trình của bạn sẽ tạo ra một chuỗi không trống mà khi được thực thi như một chương trình trong cùng ngôn ngữ sẽ tạo ra một chuỗi có nhiều entropy hơn chuỗi trước đó. Lặp đi lặp lại quá trình thực thi đầu ra này phải tạo ra một chuỗi các giá trị entropy tăng nghiêm ngặt .
Các chuỗi có thể chứa bất kỳ ký tự Unicode 9.0 . Chuỗi các chuỗi phải có tính xác định (trái ngược với ngẫu nhiên).
Các entropy cho một chuỗi nhất định sẽ được quy định như sau. Xác định các ký tự duy nhất của nó và số lần xuất hiện của chúng trong chuỗi. Tần số p i của ký tự duy nhất thứ i là số lần xuất hiện của ký tự đó chia cho chiều dài của chuỗi. Các entropy là sau đó
trong đó tổng là trên tất cả các ký tự duy nhất của chuỗi. Về mặt kỹ thuật, điều này tương ứng với entropy của một biến ngẫu nhiên rời rạc với phân phối được cho bởi các tần số quan sát được trong chuỗi.
Gọi H k là entropy của chuỗi được tạo bởi chương trình thứ k và để H 0 biểu thị entropy của mã chương trình ban đầu. Ngoài ra, hãy để L 0 biểu thị độ dài của chương trình ban đầu bằng ký tự. Chuỗi { H k } là đơn điệu theo yêu cầu thách thức và bị giới hạn (vì số lượng ký tự hiện có là hữu hạn). Do đó nó có một giới hạn, H ∞ .
Các điểm của một trình sẽ được ( H ∞ - H 0 ) / L 0 :
- Tử số, H ∞ - H 0 , phản ánh mức độ mà mã của bạn "tuân theo" quy luật tăng entropy trong một khoảng thời gian vô hạn.
- Bộ khử nhiễu, L 0 , là độ dài của mã ban đầu tính bằng ký tự (không tính bằng byte).
Mã có số điểm cao nhất sẽ thắng . Các mối quan hệ sẽ được giải quyết theo hướng gửi / chỉnh sửa sớm nhất.
Để tính toán entropy của một chuỗi, bạn có thể sử dụng các đoạn mã JavaScript (biếu không của @flawr và với sự điều chỉnh bởi @Dennis và @ETHproductions ) ở phần cuối của bài này.
Nếu lấy giới hạn H ∞ là khó khăn trong trường hợp cụ thể của bạn, bạn có thể sử dụng bất kỳ giới hạn thấp hơn, nói H 20 , để tính toán cân bằng tỷ số (do đó bạn sẽ sử dụng ( H 20 - H 0 ) / L 0 ). Nhưng trong mọi trường hợp, chuỗi entropies vô hạn phải được tăng nghiêm ngặt.
Vui lòng bao gồm một lời giải thích hoặc bằng chứng ngắn gọn rằng chuỗi các entropies đang tăng lên, nếu điều đó không rõ ràng.
Thí dụ
Trong một ngôn ngữ hư cấu, hãy xem xét mã aabcab
, khi chạy sẽ tạo ra chuỗi cdefgh
, khi chạy sẽ tạo ra cdefghi
...
Các ký tự duy nhất của mã gốc là a
, b
và c
, với tần số tương ứng 3/6, 2/6 và 1/6. Entropy của nó là 1.4591. Đây là H 0 .
Chuỗi cdefgh
có nhiều entropy hơn aabcab
. Chúng ta có thể biết điều này mà không cần tính toán nó bởi vì với một số ký tự nhất định, entropy được tối đa hóa khi tất cả các tần số đều bằng nhau. Thật vậy, entropy H 1 là 2.5850.
Chuỗi cdefghi
một lần nữa có nhiều entropy hơn so với trước đó. Bây giờ chúng ta có thể không cần tính toán vì thêm một ký tự không tồn tại luôn làm tăng entropy. Thật vậy, H 2 là 2.8074.
Nếu chuỗi tiếp theo là 42
chuỗi sẽ không hợp lệ, vì H 3 sẽ là 1, nhỏ hơn 2.8074.
Nếu, mặt khác, trình tự tiếp tục sản xuất chuỗi tăng entropy với giới hạn H ∞ = 3, điểm số sẽ là (3-1.4597) / 6 = 0,2567.
Lời cảm ơn
Nhờ vào
@xnor vì sự giúp đỡ của anh ấy để cải thiện thử thách, và đặc biệt là đã thuyết phục tôi rằng chuỗi vô hạn của entropy tăng thu được từ việc thực hiện lặp đi lặp lại là thực sự có thể;
@flawr cho một số đề xuất, bao gồm sửa đổi chức năng điểm số và để viết đoạn trích rất hữu ích;
@Angs để chỉ ra một nhược điểm thiết yếu trong định nghĩa trước về chức năng điểm số;
@Dennis để sửa lỗi trong đoạn mã JavaScript;
@ETHproductions cho một sự điều chỉnh khác trong đoạn trích;
@PeterTaylor cho một sự điều chỉnh trong định nghĩa của entropy.