ซับซ้อน 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 จะไปยังการโพสต์ที่ส่งเร็วที่สุด