เขียนตัวแก้ความซับซ้อนของ Kolmogorov


16

ซับซ้อน KolmogorovของสตริงSคือความยาวของโปรแกรมสั้นPเขียนในบางภาษาโปรแกรมLที่มีการส่งออกเป็นสิ่งS
(ใช่คำจำกัดความที่แท้จริงนั้นเป็นทางการมากกว่า แต่จะเพียงพอสำหรับความท้าทาย)

งานของคุณในความท้าทายนี้คือการเขียนที่เป็นไปได้ "Kolmogorov ซับซ้อนแก้" ที่สั้นที่สุดที่เป็นโปรแกรมที่เขียนในLตัวเองที่ใช้เวลาในสตริงSและผลตอบแทนที่สั้นที่สุดPเขียนในLที่เอาท์พุทS

วิธีไร้เดียงสาที่จะนี้คือการย้ำกว่าทุกความยาว 1 โปรแกรมแล้วทั้งหมดยาว 2 โปรแกรมแล้วทั้งหมดความยาว 3 โปรแกรมและอื่น ๆ ทำงานแต่ละของพวกเขาและการวัดการส่งออกจนกว่าโปรแกรมที่เอาท์พุทSพบ ปัญหาของวิธีนี้คือโปรแกรมบางตัวอาจไม่หยุดทำงานซึ่งหมายความว่าตัวแก้ปัญหาอาจไม่หยุดทำงาน และเนื่องจากปัญหาการหยุดทำงานไม่มีวิธีที่แน่นอนในการหลีกเลี่ยงโปรแกรมที่ไม่หยุด

เรียบง่าย แต่วิธีการแก้ปัญหาที่ไม่สมบูรณ์คือการใส่เวลาที่ จำกัด ในเวลาดำเนินการของแต่ละศักยภาพP 's โปรแกรมที่ไม่ได้หยุดชะงักในเวลาอาจถูกส่งผ่าน แต่ตัวแก้ปัญหาจะหยุดแน่นอน (สมมติว่าโปรแกรมในLสามารถส่งออกSภายในเวลาที่กำหนด)

ท้าทาย

เขียนตัวแก้ปัญหาของคุณเป็นโปรแกรมหรือฟังก์ชั่นที่มีสามสิ่ง:

  • สตริงS
  • เลขจำนวนเต็มบวกTนั่นคือการ จำกัด เวลาในหน่วยวินาทีหรือบางช่วงเวลาที่เล็กลง (เช่นมิลลิวินาที)
  • สตริงAของตัวอักษรของอักขระที่ใช้สำหรับP 'ที่มีศักยภาพ

และผลที่สั้นที่สุดPที่มีเพียงตัวละครในวิ่งในเวลาน้อยกว่าTหน่วยเวลาและเอาท์พุทS

นี่คือ pseudocode ทั่วไป:

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

รายละเอียด

  • คุณอาจจะคิดว่ามีจะเป็นPทำจากตัวอักษรในที่วิ่งในเวลาTที่เอาท์พุทS
  • คุณอาจสันนิษฐานว่าการดำเนินการของP ที่อาจเกิดขึ้นจะไม่มีผลข้างเคียงที่ป้องกันไม่ให้ตัวแก้ปัญหาทำงานหรือทำงานอย่างถูกต้อง (เช่นทำกับหน่วยความจำที่จัดสรรของตัวแก้ปัญหา)
  • คุณอาจไม่คิดว่าPที่เป็นไปได้นั้นไม่มีข้อผิดพลาด ตรวจสอบให้แน่ใจว่าได้รวมtry/ catchบล็อกหรือสิ่งที่เกี่ยวข้องกับการเรียกใช้การเรียกใช้
  • ถ้ามีP ที่สั้นที่สุดหลายอันก็จะพอเพียง "Shortness" วัดเป็นอักขระที่ไม่ใช่ไบต์
  • ผลลัพธ์ของP ที่อาจเกิดขึ้นคือสิ่งที่พิมพ์ไปยัง stdout (หรือพื้นที่ส่งออกปกติของภาษาของคุณ) สตริงว่างศักยภาพP
  • ในอุดมคติแล้วตัวแก้ปัญหาของคุณจะอนุญาตให้Aมีอักขระใด ๆ ต้องอย่างน้อยเพื่อให้สามารถมีASCII พิมพ์ตัวอักษรบวกแท็บและการขึ้นบรรทัดใหม่
  • อินพุตอาจมาจากไฟล์ / stdin / บรรทัดคำสั่ง / ฟังก์ชัน args เอาต์พุตไปที่ stdout หรือคล้ายกันหรือสามารถส่งคืนเป็นสตริงได้หากคุณเขียนฟังก์ชัน

เกณฑ์การให้คะแนน

การส่งที่มีไบต์น้อยที่สุดจะเป็นผู้ชนะ Tiebreaker จะไปยังการโพสต์ที่ส่งเร็วที่สุด


7
สมองของฉันเจ็บ
Alex A.

1
คุณสามารถผ่อนคลายข้อกำหนดที่ภาษาและภาษาเป้าหมายที่ตัวแก้เมตาเขียนไว้ต้องเหมือนกันได้หรือไม่?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

และมันจะเป็นไปได้หรือไม่ที่จะเขียนโปรแกรมที่แปลงเอาท์พุทเป็นการแสดงตัวอักษรของสตริง?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ไม่ประเด็นคือทำในภาษาเดียวกัน ใช่ แต่นั่นอาจไม่ใช่โปรแกรมที่สั้นที่สุดเสมอไป
งานอดิเรกของ Calvin

@ Calvin'sHobbies: สุดท้ายแล้วมันเป็นเพียงความท้าทายของรหัสกอล์ฟเพื่อค้นหาว่าภาษาใดที่สามารถเขียนโค้ดเพื่อเรียกสิ่งอำนวยความสะดวก (หรือใช้คอมไพเลอร์หากขาด) เพื่อรวบรวมภาษาเอง
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

คำตอบ:


11

Python 3, 240 236 ไบต์

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

อย่าเรียกใช้สิ่งนี้ อย่างน้อยในคอมพิวเตอร์ของฉันฉันพบว่าโปรแกรมนั้นยากที่จะหยุดทันทีที่มันเริ่มทำงานเนื่องจากหน้าต่างป๊อปอัปที่สร้างขึ้นต่อกระบวนการ

timeouts ถูกเพิ่มเข้าsubprocess.check_outputใน Python 3 เท่านั้นซึ่งเป็นสาเหตุที่เราใช้สิ่งนี้มากกว่า Python 2

ต่อไปนี้เป็นเวอร์ชั่นทางเลือกที่มีโปรแกรมtime.sleepที่จะพิมพ์โปรแกรมที่ถูกต้องทั้งหมดที่พบตลอดเส้นทางรวมถึงผลลัพธ์ที่เกี่ยวข้อง:

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

โปรแกรมใช้ชื่อไฟล์aสำหรับแต่ละโปรแกรมPที่จะทำการทดสอบดังนั้นหากคุณเรียกใช้สิ่งนี้ตรวจสอบให้แน่ใจว่าคุณยังไม่มีไฟล์ของชื่อนั้น แทนที่["py","-3","a"]ด้วยคำสั่งที่เหมาะสมสำหรับการตั้งค่าของคุณ (เช่น["python","a"]หรือ["python3","a"])

คุณสามารถเปลี่ยนsleepระยะเวลาตามความเสี่ยงของคุณเองได้ :) โทรเหมือนf("1\r\n",1,"1()print")ที่Tเป็นหมดเวลาในไม่กี่วินาที

สองสามบรรทัดแรกของเอาต์พุตจากตัวทดสอบโดยมีการเรียกข้างต้น:

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

(ถ้าคุณต้องการช่วยโปรแกรมตามบิตคุณสามารถเปลี่ยนP="".join(P)เป็นP="print"+"".join(P))

เนื่องจากโปรแกรมข้างต้นไม่มีผลลัพธ์นี่คือผลลัพธ์สำหรับf("1\r\n",1,["print","(",")","1"])(โทเค็นไม่ได้เป็นส่วนหนึ่งของความท้าทาย แต่ฉันต้องการแสดงสิ่งที่เกิดขึ้น):

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

'print(1)'ค่าตอบแทนเป็นสตริง

ในที่สุดเพื่อความสนุกนี่คือสิ่งที่จะเกิดขึ้นหากตัวอักษรstring.printableคือ

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

ลิงค์ Pastebin ของโปรแกรมที่ถูกต้อง 0-2 char Python 3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.