ตัวตรวจสอบ Meta quine


10

ความท้าทายนี้ถ้าคุณยอมรับมันคือการเขียนสามฟังก์ชันหรือโปรแกรม A, B และ C:

  • A คือ quine ที่ส่งออกทั้งหมด A, B และ C (ซึ่งเป็นเนื้อหาทั้งหมดของรหัสในการส่งของคุณ)
  • B รับพารามิเตอร์ F และตรวจสอบว่ามันเป็นควินดัง (เอาท์พุท FBC) หรือทำสิ่งที่แตกต่าง
  • C รับพารามิเตอร์ G และตรวจสอบว่า G อาจทำงานเช่น B หรือไม่ (ตรวจสอบว่า F เอาต์พุต FGC) เป็นไปไม่ได้ที่จะตัดสินใจว่าฟังก์ชั่นเป็นตัวตรวจสอบ quine หรือไม่ดังนั้นเราจะทำสิ่งที่ง่ายกว่า:
    • มันจะต้องกลับมาจริงถ้า G ใช้ได้สำหรับ B
    • มันจะต้องคืนค่าเท็จถ้า G คืนค่าเท็จให้กับผลการทดสอบที่ถูกต้องทั้งหมดหรือ G จะคืนค่าความจริงสำหรับการทดสอบที่ไม่ถูกต้องทั้งหมด
    • มันสามารถคืนสิ่งใด ๆ ผิดพลาดหรือไม่ยุติ ฯลฯ หากเป็นกรณีอื่น

โปรดทราบว่า B เป็นไปได้ A และ F ไม่มีอินพุตใด ๆ ดังนั้นคุณสามารถเรียกใช้และตรวจสอบผลลัพธ์ได้

กฎระเบียบ

  • ควรมีวิธีที่จะบอกได้ว่าส่วนใดเป็น A, B และ C จากเอาต์พุตของ A ตัวอย่างเช่น: แต่ละอันมีหนึ่งบรรทัดหรือพวกเขาได้รับการยอมรับว่าเป็นสามหน้าที่ในล่าม
  • แต่ละฟังก์ชั่นควรทำงานด้วยคำจำกัดความของตัวเองเท่านั้นไม่ใช่รหัสที่สมบูรณ์ของคุณ
  • คุณสามารถใช้ฟังก์ชัน / โปรแกรมหรือซอร์สโค้ดหรือทั้งคู่เป็นอินพุตของ B (หรือ G) และ C
  • คุณสามารถกำหนดความจริง / เท็จเป็นชุดย่อยของค่าเหล่านั้น คุณสามารถกำหนดให้ F ส่งคืนชนิดที่คุณเลือกได้เช่นสตริงเดียว
  • คุณสามารถต้องการ A, B, F และ G หากถูกเรียกด้วยพารามิเตอร์ที่ถูกต้องอย่างต่อเนื่องไม่มีอินพุตหรือผลข้างเคียงอื่น ๆ บางประเภทที่คุณเลือกเช่นการเข้าถึงตัวแปรทั่วโลกหรือการอ่าน stdin เป็นต้น
  • นอกจากนี้คุณยังสามารถสมมติว่า F และ G หากพวกเขาถูกเรียกด้วยพารามิเตอร์ที่ถูกต้องยุติลงเสมอ
  • F ควรทำงานในสภาพเดียวกับ A. ดังนั้นจึงไม่สามารถขึ้นอยู่กับ B หรือ C หรือการดำรงอยู่ของตัวแปรอื่นยกเว้นตัวแปรนั้นจะถูกกำหนดในส่วนของตัวเองในเอาท์พุท
  • ไม่มีฟังก์ชั่นหรือโปรแกรมใด ๆ ที่สามารถอ่านซอร์สโค้ดของมันได้
  • นี่คือ code-golf รหัสที่สั้นที่สุด (ซึ่งเป็นผลลัพธ์ของ A) ในหน่วยไบต์

B ยังคงเป็นไปไม่ได้โดยทั่วไปเพราะ F อาจไม่ยุติเช่นเดียวกับในทางปฏิบัติในหลายภาษาเพราะมันต้องใช้ความสามารถหลายอย่างเช่นการเปลี่ยนเส้นทางชั่วคราวของ stdout และฟังก์ชั่นกับสตริงหรือ exec สิ่งที่ดีที่สุดที่คุณสามารถคาดหวังได้ก็น่าจะเป็นทางออกครึ่งทางใน LISP
Peter Taylor

คุณจะตรวจสอบ G กับทุกคำสั่งและไม่ใช่แบบทดสอบได้อย่างไร ฉันกำลังทำงานเกี่ยวกับวิธีการแก้ปัญหาทางคณิตศาสตร์
LegionMammal978

@PeterTaylor "นอกจากนี้คุณยังสามารถสมมติว่า F และ G หากพวกเขาถูกเรียกด้วยพารามิเตอร์ที่ถูกต้องให้ยุติเสมอ" และ "เอาท์พุท" อาจหมายถึงการส่งคืนไม่จำเป็นต้องพิมพ์ไปยัง stdout
jimmy23013

@ LegionMammal978 เป็นไปไม่ได้ที่จะตรวจสอบทุกข้อและทุกข้อ แต่งานของ C นั้นเป็นสิ่งที่ง่ายกว่าที่คุณจะต้องตรวจสอบควินินหนึ่งอันและที่ไม่ใช่ควินิน
jimmy23013

1
@PyRulez ฉันคิดว่านี่เป็นจิตวิญญาณของความท้าทายนี้ดังนั้นฉันจะอนุญาต แต่ฟังก์ชั่นไม่สามารถเข้าถึงซอร์สโค้ดของตัวเอง
jimmy23013

คำตอบ:


1

CJam, 254 ไบต์

คำตอบตัวอย่างไม่ใช่การเล่นกอล์ฟ

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

3 ฟังก์ชั่นคือ:

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}
{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}
{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

A และ F ไม่มีพารามิเตอร์และส่งคืนสตริง B, G และ C ทำการบล็อก CJam เป็นพารามิเตอร์และส่งคืน 1 สำหรับความจริงหรือ 0 สำหรับความเท็จ

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