Viết một bộ giải phức tạp Kolmogorov


16

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/ catchkhố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.


7
Não tôi đau.
Alex A.

1
Bạn có thể nới lỏng yêu cầu rằng ngôn ngữ đích và ngôn ngữ mà trình giải meta được viết phải giống nhau không?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Và có thể chỉ cần viết một chương trình chuyển đổi đầu ra thành biểu diễn chuỗi ký tự của ngôn ngữ không?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Không, vấn đề là làm điều đó trong cùng một ngôn ngữ. Có, nhưng đó không phải lúc nào cũng là chương trình ngắn nhất.
Sở thích của Calvin

@ Calvin'sHobbies: Vì vậy, cuối cùng, việc tìm ra ngôn ngữ nào có thể dễ dàng viết mã để gọi các cơ sở (hoặc thực hiện trình biên dịch khi vắng mặt) để tự biên dịch ngôn ngữ?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Câu trả lời:


11

Python 3, 240 236 byte

import subprocess as s,itertools as i
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   try:
    P="".join(P);open("a","w").write(P)
    if s.check_output(["py","-3","a"],timeout=T).decode()==S:return P
   except:1
  N+=1

Đừng chạy cái này. Trên máy tính của tôi, ít nhất, tôi thấy chương trình thực sự khó dừng khi chương trình bắt đầu chạy do các cửa sổ bật lên được tạo trên mỗi quy trình.

timeouts chỉ được thêm subprocess.check_outputvào Python 3, đó là lý do tại sao chúng tôi sử dụng cái này chứ không phải Python 2.

Đây là phiên bản thay thế với phiên bản time.sleepcũng in tất cả các chương trình hợp lệ được tìm thấy trên đường đi, cũng như đầu ra tương ứng của chúng:

import subprocess as s,itertools as i
import time
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   time.sleep(0.2)
   try:
    P="".join(P);open("a","w").write(P);C=s.check_output(["py","-3","a"],timeout=T).decode()
    print(P,repr(C))
    if C==S:return P
   except:1
  N+=1

Chương trình sử dụng tên tệp a cho từng chương trình Psẽ được kiểm tra, vì vậy nếu bạn chạy nó, hãy đảm bảo rằng bạn chưa có tệp có tên đó. Thay thế ["py","-3","a"]bằng lệnh thích hợp cho thiết lập của bạn (ví dụ ["python","a"]hoặc ["python3","a"]).

Hãy thoải mái thay đổi sleepthời gian có nguy cơ của riêng bạn :). Gọi như thế f("1\r\n",1,"1()print"), đâu Tlà thời gian chờ tính bằng giây.

Một vài dòng đầu ra từ trình kiểm tra với lệnh gọi trên:

 ''
1 ''
11 ''
() ''
111 ''
(1) ''
int ''
1111 ''

(Nếu bạn muốn giúp chương trình một chút, bạn có thể thay đổi P="".join(P) thành P="print"+"".join(P))

Vì tất cả các chương trình trên đều không có đầu ra, đây là kết quả cho f("1\r\n",1,["print","(",")","1"]) (mã thông báo không phải là một phần của thử thách, nhưng tôi muốn hiển thị những gì xảy ra):

 ''
print ''
1 ''
() ''
11 ''
print() '\r\n'
(print) ''
(1) ''
111 ''
print(print) '<built-in function print>\r\n'
print(1) '1\r\n'

Giá trị trả về là chuỗi 'print(1)'.

Cuối cùng, chỉ để cho vui, đây là những gì xảy ra nếu bảng chữ cái là string.printable, tức là

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

Liên kết pastebin của tất cả các chương trình 0-2 char Python 3 hợp lệ

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.