นี่คือความท้าทายในการเล่นกอล์ฟซึ่งคุณต้องคิดโปรแกรมที่ทำหน้าที่เหมือนควินินหรือควินินที่ปรับเปลี่ยนตัวเองเพื่อแสดงการเรียนรู้ของเครื่อง
พื้นหลัง
มีโปรแกรมปัญญาประดิษฐ์พื้นฐานที่เรียกว่า 'เกมลิ่น' ซึ่งจะอธิบายเป็นที่นี่ แนวคิดพื้นฐานคือโปรแกรมเมื่อเรียกใช้ในครั้งแรกที่ถาม:
ตกลงได้โปรดคิดถึงบางสิ่ง
มันเป็นลิ่นหรือ?
จากนั้นคุณสามารถตอบกลับอย่างใดอย่างหนึ่ง:
ใช่
ในกรณีนี้มันบอกว่า:
ดี. นั่นเป็นเรื่องง่ายมาก
หรือถ้าไม่มันบอกว่า:
โอ้ ถ้างั้นคุณก็ชนะ - คุณคิดอะไรอยู่
ซึ่งคุณอาจพูดว่า:
สุนัข
ซึ่งมันจะบอกว่า
กรุณาให้คำถามกับฉันเกี่ยวกับสุนัขดังนั้นฉันสามารถบอกความแตกต่างระหว่างสุนัขกับ pangolin ได้
คุณอาจตอบกลับ
กินมดไหม
จากนั้นจะถาม:
คำตอบสำหรับสุนัขคืออะไร?
ที่คุณจะพูดว่า
ไม่
และมันจะบอกว่า
ขอบคุณ
ครั้งต่อไปที่มันทำงานมันจะถามคำถามข้างต้นและจะสร้างต้นไม้ไบนารีของคำถามดังกล่าว
ความท้าทาย
พอพื้นหลัง ความท้าทายนี้คือการเขียนโปรแกรม pangolin ที่ดัดแปลงด้วยตนเอง กฎมีดังนี้:
เอาท์พุท Program (ตามที่อธิบายไว้ข้างต้น)
STDERR
ควรจะ คำตอบสุดท้ายจะเป็น "ดีนั่นเป็นเรื่องง่ายมาก" หรือ "ขอบคุณ" หลังจากนี้ควรส่งออกทั้งเวอร์ชันปัจจุบันของโปรแกรมหรือเวอร์ชันใหม่ของโปรแกรมที่รวมคำถามไว้STDOUT
ด้วย ไม่มีคำตอบที่เขียนในภาษาที่ไม่สนับสนุนการเขียนSTDOUT
และSTDERR
หรือการอ่านจากSTDIN
จะถูกต้องกล่าวอีกนัยหนึ่งภายใต้ UNIX คุณสามารถเรียกใช้โปรแกรมดังนี้:
ตัวอย่าง:
$ mylanguage myprogram > myprogram.1
[dialog goes here]
$ mylanguage myprogram1 > myprogram.2
[dialog goes here]
- โปรแกรมต้องใช้พรอมต์ที่ระบุทุกประการ (เนื่องจากการตัดทอนพรอมต์แสดงว่าไม่มีทักษะ) พรอมต์คือ (โดยไม่ใส่เครื่องหมายอัญประกาศและแทนที่ด้วย% s) ดังต่อไปนี้:
รายการ:
"OK, please think of something"
"Is it %s?"
"Good. That was soooo easy."
"Oh. Well you win then -- What were you thinking of?"
"Please give me a question about %s, so I can tell the difference between %s and %s"
"What is the answer for %s?"
"Thanks"
เมื่อคาดหวังคำตอบใช่ / ไม่ใช่โปรแกรมของคุณควรยอมรับ
y
หรือไม่ว่าyes
ในกรณีใดสำหรับ 'ใช่' และn
หรือno
ในกรณีใด ๆ สำหรับ 'ไม่' สิ่งที่คุณทำกับอินพุตที่ไม่เป็นไปตามนั้นขึ้นอยู่กับคุณ ตัวอย่างเช่นคุณอาจตัดสินใจที่จะรับคำตอบใด ๆ ที่ขึ้นต้นด้วยy
หรือY
เป็น 'ใช่' และสิ่งอื่นใดที่ไม่ใช่คุณอาจจะสมมติว่าชื่อของสิ่งที่ให้มาและคำถามที่ประกอบด้วยตัวอักษร ASCII, ตัวเลข, ช่องว่างยัติภังค์เครื่องหมายคำถามเครื่องหมายจุลภาคมหัพภาคทวิภาคและอัฒภาคคือพวกเขาตรงกับ
^[-?,.;: a-zA-Z]+$
regex หากคุณสามารถรับมือได้มากกว่านั้น (โดยเฉพาะอย่างยิ่งตัวละครที่อ้างถึงในภาษาที่คุณเลือก) คุณจะต้องพอใจ แต่ไม่ได้รับคะแนนพิเศษใด ๆโปรแกรมของคุณอาจจะไม่ได้อ่านหรือเขียนไฟล์ใด ๆ (ไม่รวม
STDIN
,STDOUT
และSTDERR
) หรือจากเครือข่ายนั้น โดยเฉพาะมันไม่สามารถอ่านหรือเขียนรหัสของตัวเองจากดิสก์ สถานะของมันจะต้องถูกบันทึกไว้ในรหัสโปรแกรมเองเมื่อโปรแกรมทำงานและคาดเดาคำตอบได้อย่างถูกต้องโปรแกรมจะต้องทำงานอย่างถูกต้องเหมือนกับ quine นั่นคือต้องเขียนไปยัง
STDOUT
รหัสของตัวเองไม่เปลี่ยนแปลงเมื่อโปรแกรมรันและเดาคำตอบไม่ถูกต้องจะต้องเข้ารหัสคำถามและคำตอบใหม่ที่ให้ไว้ในรหัสของตัวเองและเขียนลง
STDOUT
ในรหัสของมันเองดังนั้นจึงสามารถแยกความแตกต่างระหว่างการเดาดั้งเดิมกับวัตถุใหม่ที่ให้ไว้ใน นอกจากนี้เพื่อแยกความแตกต่างระหว่างวัตถุที่ได้รับก่อนหน้านี้ทั้งหมดคุณจะต้องสามารถรับมือกับการรันต่อเนื่องหลาย ๆ ครั้งของซอฟต์แวร์เพื่อเรียนรู้เกี่ยวกับวัตถุจำนวนมาก ดูที่นี่สำหรับตัวอย่างการวิ่งหลายครั้ง
การทดสอบจะกระทำที่ลิงค์ในหัว (เห็นได้ชัดว่าครอบคลุมเฉพาะ
STDIN
และSTDERR
โต้ตอบ)ช่องโหว่มาตรฐานไม่รวมอยู่