สร้างตัวแก้ปริศนา MU


16

ปริศนา MUเป็นปริศนาที่คุณพบว่าคุณสามารถเปิดMIเข้าไปMUให้การดำเนินงานดังต่อไปนี้:

  1. หากสตริงของคุณสิ้นสุดลงIคุณสามารถเพิ่ม a Uถึงท้าย (เช่นMI -> MIU)

  2. หากสตริงของคุณเริ่มต้นด้วยMคุณสามารถผนวกสำเนาของส่วนหลังจากMที่สตริง
    (เช่นMII -> MIIII)

  3. ถ้าสายของคุณมีสามติดต่อกันของคุณอาจมีการเปลี่ยนแปลงให้เป็นI (เช่น)U
    MIII -> MU

  4. หากสตริงของคุณมีสองรายการติดกันUคุณสามารถลบออกได้ (เช่นMUUU -> MU)

งานของคุณคือการสร้างโปรแกรมที่กำหนดว่าสิ่งนี้สามารถทำได้สำหรับสตริงเริ่มต้นและสิ้นสุด

โปรแกรมของคุณจะใช้สองสายเป็นอินพุต แต่ละสตริงจะประกอบด้วยสิ่งต่อไปนี้:

  • Mหนึ่ง

  • สตริงถึงยี่สิบเก้าI'และU' s

โปรแกรมของคุณจะส่งคืนtrue(หรือเป็นตัวแทนของภาษาการเขียนโปรแกรมของมัน / YPLRT) หากสตริงที่สองสามารถเข้าถึงได้จากสตริงแรกและfalse(หรือ YPLRT) หากไม่ใช่

ตัวอย่างอินพุตและเอาต์พุต:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

รหัสที่สั้นที่สุดในภาษาใด ๆ เพื่อทำสิ่งนี้ชนะ


8
ฉันกำลังอ่านGödel, Escher, Bach และคิดเกี่ยวกับการทำ "สนามกอล์ฟ 18-hole" ตามบทของมันในภายหลัง เดาว่าฉันต้องหา "หลุม 1" ใหม่เดี๋ยวนี้ ;)
Martin Ender

นี่เป็นเพียงคำถามเกี่ยวกับความสามารถในการเข้าถึงกราฟที่มีการถามถึงสาระสำคัญหลายครั้งก่อนหน้านี้
Peter Taylor

1
@PeterTaylor ฉันคิดว่ามีโอกาสที่ดีที่จะไม่สามารถแก้ไขได้โดยการค้นหากราฟความสามารถในการเข้าถึงอย่างชัดเจน กฎ MIU มีโครงสร้างจำนวนมากและฉันจะไม่แปลกใจถ้ามีอัลกอริทึมโดยตรงในการทดสอบการเข้าถึงโดยไม่ต้องค้นหาโหนดระดับกลาง ตัวอย่างเช่นโหนดที่เข้าถึงได้MIนั้นเป็นM(I|U)*จำนวนที่Iไม่เท่ากับ 3 อย่างแน่นอนและการตรวจสอบโดยตรงนั้นจะทำให้รหัสสั้นลงอย่างแน่นอน นอกจากนี้ฉันไม่ทราบเกี่ยวกับ a-Priori เกี่ยวกับความยาวของสตริงที่จำเป็นสำหรับขั้นตอนกลางดังนั้นการค้นหาโดยตรงอาจไม่สามารถทำได้
xnor

1
ฉันเคยคิดเกี่ยวกับปัญหานี้มาระยะหนึ่งแล้วและยังไม่ได้ใกล้เคียงกับวิธีแก้ปัญหาที่ไม่ได้โหดร้าย หากไม่มีใครกัดฉันขอแนะนำให้โพสต์คำถามรุ่นที่ง่ายขึ้นบางทีอาจเป็นสาเหตุมาจากMIสตริงที่เข้าถึงได้
xnor

1
สิ่งที่ส่งออกควรจะเป็นถ้าIMเป็นที่จัดทำหรือMUMMI?
สลายตัวเบต้า

คำตอบ:


7

SWI Prolog, 183 ตัวอักษร

m(A,A).
m([i],[i,u]).
m([i,i,i|T],B):-m([u|T],B).
m([u,u|T],B):-m(T,B).
n([m|A],[m|B]):-(m(A,B);append(A,A,X),m(X,B)).
n(A,B):-m(A,B).
s(A,B):-atom_chars(A,X),atom_chars(B,Y),n(X,Y).

วิธีการเกี่ยวกับบางส่วนของ Prolog (เนื่องจากไม่มีใครตอบใน 6 เดือน) หากต้องการเรียกใช้เพียงใช้ "s (mi, mu)" รหัสแบ่งอะตอมออกเป็นตัวอักษรจากนั้นค้นหาวิธีแก้ปัญหา


2
สิ่งนี้จะส่งกลับเท็จอย่างไม่ถูกต้องs(mi,miiii)และโดยทั่วไปสิ่งใดก็ตามที่ต้องการมากกว่าหนึ่งแอปพลิเคชันของกฎ 2 เพื่อพิสูจน์
algorithmshark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.