Các Kolmogorov phức tạp của một chuỗi S là độ dài của chương trình ngắn nhất P , viết bằng một số ngôn ngữ lập trình L , mà đầu ra là chính xác S .
(Vâng, định nghĩa thực sự chính thức hơn nhưng điều này sẽ đủ cho thách thức.)
Nhiệm vụ của bạn trong thử thách này là viết càng tốt "Kolmogorov độ phức tạp giải quyết" ngắn nhất, đó là một chương trình viết bằng L bản thân mà mất trong một chuỗi S và lợi nhuận ngắn nhất P viết bằng L rằng kết quả đầu ra S .
Cách tiếp cận ngây thơ cho việc này là lặp đi lặp lại trên tất cả các chương trình có độ dài 1, sau đó tất cả các chương trình có độ dài 2, sau đó tất cả các chương trình dài 3, v.v., chạy từng chương trình và đo đầu ra cho đến khi tìm thấy chương trình đầu ra S. Vấn đề với cách tiếp cận này là một số chương trình này có thể không bao giờ ngừng chạy, điều đó có nghĩa là bản thân người giải có thể không bao giờ dừng lại. Và do vấn đề tạm dừng , không có cách nào chắc chắn để tránh các chương trình không dừng lại.
Một giải pháp đơn giản, không hoàn hảo là đặt giới hạn thời gian cho thời gian thực hiện của mỗi P tiềm năng . Các chương trình không dừng lại kịp thời có thể được thông qua, nhưng người giải quyết chắc chắn sẽ dừng lại (giả sử rằng một chương trình trong L thực sự có thể xuất S trong thời gian giới hạn).
Thử thách
Viết bộ giải của bạn dưới dạng một chương trình hoặc hàm có ba điều sau:
- Chuỗi S .
- Số nguyên dương T là giới hạn thời gian tính bằng giây hoặc một khoảng thời gian nhỏ hơn (ví dụ: mili giây).
- Một chuỗi A của bảng chữ cái các ký tự được sử dụng cho các P tiềm năng .
Và kết quả đầu ra ngắn nhất P mà chỉ chứa các ký tự trong một , chạy trong vòng chưa đầy T đơn vị thời gian, và kết quả đầu ra S .
Đây là mã giả chung:
Function KolmogorovComplexitySolver(S, T, A):
Assign N to 0
Loop until function returns:
In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
Execute P, saving the output to O, stopping the execution if it takes longer than time T
If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
Return P
Add 1 to N
Chi tiết
- Bạn có thể giả định rằng sẽ luôn có một P được làm từ các nhân vật trong một mà chạy trong thời gian T mà kết quả đầu ra S .
- Bạn có thể cho rằng việc thực thi các P tiềm năng sẽ không có tác dụng phụ ngăn người giải chạy hoặc hoạt động chính xác (như làm rối với bộ nhớ được phân bổ của người giải).
- Bạn không thể cho rằng các P tiềm năng không có lỗi. Hãy chắc chắn bao gồm
try
/catch
khối hoặc bất cứ điều gì áp dụng xung quanh cuộc gọi thực hiện. - Nếu có nhiều P ngắn nhất , thì bất kỳ sẽ đủ. "Độ ngắn" được đo bằng các ký tự không phải byte.
- Đầu ra của P tiềm năng là những gì được in ra thiết bị xuất chuẩn (hoặc khu vực đầu ra thông thường của ngôn ngữ của bạn). Chuỗi rỗng là một P tiềm năng .
- Lý tưởng nhất là người giải của bạn sẽ cho phép A chứa bất kỳ ký tự nào. Một phải ít nhất để có thể chứa ASCII in ký tự cộng với các tab và newlines.
- Đầu vào có thể đến từ tệp / stdin / dòng lệnh / hàm args. Đầu ra đi đến thiết bị xuất chuẩn hoặc tương tự, hoặc có thể được trả về dưới dạng chuỗi nếu bạn đã viết một hàm.
Chấm điểm
Việc gửi với ít byte nhất sẽ thắng. Tiebreaker đi đến trình sớm nhất được đăng.