มันเป็น Cube ของ Rubik หรือไม่?


25

เวลาผ่านไปของการเคารพคนเดินเท้าคือการชี้ให้เห็นว่าภาพของ "ลูกบาศก์ของรูบิค" (บนเสื้อยืดโปสเตอร์และอื่น ๆ ) ไม่สามารถแก้ไขได้จริง

สิ่งแรกที่ควรตรวจสอบคือลูกบาศก์นั้นประกอบด้วยชิ้นส่วนที่ถูกต้อง ในการแก้ไขได้ลูกบาศก์จำเป็นต้องมีหกสีแต่ละอันมีเก้าช่องสี่เหลี่ยม คิวบ์ยังต้องการหน่วยขอบและมุมแต่ละอัน (นี่คือคิวบ์ขนาดเล็กที่ประกอบขึ้นเป็นลูกบาศก์) เพื่อให้มีความเป็นเอกลักษณ์ ไม่เพียง แต่จะต้องไม่ซ้ำกัน แต่ถ้าชิ้นกลางสองอันอยู่ตรงข้ามกันไม่มีขอบหรือมุมชิ้นส่วนสามารถมีสีทั้งสอง

เมื่อคุณมีลูกบาศก์ที่สร้างขึ้นจากชิ้นส่วนที่ถูกต้องทั้งหมดคุณยังต้องตรวจสอบว่าสามารถแก้ไขได้ มีกฎอยู่สองสามข้อดังนั้นฉันจะบอกผู้เชี่ยวชาญให้อธิบายเหล่านั้นผู้สปอยเลอร์ด้านล่างอธิบายว่าเราสามารถทำสิ่งนี้ได้อย่างไร หากคุณสนใจที่จะแก้ไขปัญหาด้วยตัวคุณเองคุณไม่จำเป็นต้องไปที่ไซต์เพื่อทำความเข้าใจหรือเข้าร่วมในการท้าทายนี้

คำอธิบายที่เชื่อมโยง

งานของคุณคือใช้รูปแบบเป็นอินพุตและพิจารณาว่าจริง ๆ แล้วเป็นลูกบาศก์ของรูบิคที่แก้ไขได้หรือไม่ เพื่อให้สามารถแก้ไขได้ต้องมีวิธีดำเนินการย้ายที่ถูกต้องบนคิวบ์เพื่อให้คิวบ์มีสีเดียวเท่านั้นในแต่ละหน้า (และใบหน้าที่แตกต่างกันมีสีต่างกัน) ลูกบาศก์ของรูบิคส่วนใหญ่มีสีมาตรฐาน (สีขาวตรงข้ามกับสีเหลือง ฯลฯ ) คุณอาจไม่คิดว่าสถานะการแก้ปัญหาจะตามด้วยสีเฉพาะนี้

การเคลื่อนไหวที่ถูกต้องคือการหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาของลูกบาศก์ใบหน้า ด้วยการหมุนของใบหน้าของลูกบาศก์สี่เหลี่ยมใด ๆ ที่มีพรมแดนติดกับใบหน้าจะถูกหมุนเช่นกันเชื่อมต่อกับใบหน้าที่พวกเขาสัมผัสก่อนหน้านี้

IO

คุณอาจใช้ลูกบาศก์ในลักษณะที่สมเหตุสมผล หากภาษาของคุณมีชนิด "คิวบ์ใบหน้า" ในตัวซึ่งดีสำหรับคุณนั่นก็ดีเหมือนการป้อนข้อมูลและอื่น ๆ ที่ชาญฉลาดคุณสามารถใช้อาร์เรย์ 2 มิติของตาข่ายก้อน 1 1 3 โดย 3 รายการสำหรับแต่ละหน้า เพียงแค่มีเหตุผล หากคุณต้องการทราบว่ารูปแบบที่เฉพาะเจาะจงเป็นความคิดเห็นที่ยอมรับได้หรือ ping ฉันในการแชทและฉันจะเพิ่มความท้าทายเพื่อระบุความถูกต้อง

รูปแบบการป้อนข้อมูลของคุณต้องการการสนับสนุนเฉพาะสีที่เป็นไปได้สูงสุด 9 สีเท่านั้น

สำหรับผลลัพธ์นี่เป็นปัญหาในการตัดสินใจดังนั้นคุณควรส่งออกหนึ่งค่าคงที่สำหรับ "ใช่นี่คือคิวบ์ของรูบิคที่ถูกต้อง" และค่าคงที่ที่แตกต่างกันหนึ่งค่าสำหรับ "ไม่นี่ไม่ใช่ลูกบาศก์รูบิคที่ถูกต้อง"


นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าจะดีกว่า

กรณีทดสอบ

นี่คือกรณีทดสอบ พวกเขาจะจัดรูปแบบเป็นสุทธิของลูกบาศก์กับแต่ละตารางเป็นตัวอักษรเดียว ตัวอักษรที่แตกต่างกันแสดงถึงสีที่ต่างกัน สามารถเพิ่ม testcases เพิ่มเติมได้เมื่อมีการร้องขอ

แก้ปัญหาได้

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

แก้ไม่ได้

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
   BBB
   YWY
   YYY


   RRW
   RRW
   GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
   BBB
   YYW
   YYO

14
ฉันรู้สึกผูกพันที่จะต้องชี้ให้เห็นว่าลูกบาศก์ของรูบิคในอวาตาร์ของคุณไม่สามารถแก้ไขได้ มันมีแค่ 4 ช่องทางด้านข้างที่เราเผชิญอยู่ในขณะที่ลูกบาศก์ของรูบิคปกติควรมี 9 ไม่ต้องพูดถึงสัญลักษณ์แปลก ๆ ที่อยู่ด้านบนของสี่เหลี่ยม
DJMcMayhem

2
@DJMcMayhem ลูก ๆ ของฉันมีลูกบาศก์ของ Rubik ที่มี "sub-cubes" เพียงสี่ลูก
อดัม

2
@ H.PWiz ไม่คุณไม่สามารถ นั่นเป็นนัยในคำจำกัดความของฉัน แต่ฉันจะทำให้ชัดเจนในคำถาม
ข้าวสาลีตัวช่วยสร้าง

2
ข้อมูลจำเพาะของคุณไม่ได้รวมคำอธิบายที่สมบูรณ์ของกฎหมายสามข้อของลูกบาศก์ 1. เป็นไปไม่ได้ที่จะมีเพียง 1 ขอบพลิก 180 องศา (กล่าวถึง) 2. เป็นไปไม่ได้ที่จะมีมุม 1 มุมบิด 120 องศา (ไม่ได้กล่าวถึง) 3. เป็นไปไม่ได้ที่จะมีการเปลี่ยนแปลงแบบคี่ของคี่ ) ฉันกำลังลงคะแนนอย่างใกล้ชิดจนกว่าจะได้รับการแก้ไข ดูryanheise.com/cube/cube_laws.htmlคำอธิบาย
เลเวลริเวอร์เซนต์

4
@ LevelRiverSt ให้สังเกตว่าลูกบาศก์ของรูบิคนั้นอยู่ในตัวเองทุกคนสามารถได้มาซึ่งสูตรทางคณิตศาสตร์และกฎหมายความเท่าเทียมกันได้อย่างอิสระ
user202729

คำตอบ:


14

Cubically , 1664 1631 1089 ไบต์

⇒FD2F'R'D2RUR'D2RFD2F'U'
⇒Ff1F'
⇒LFf1F'L'
⇒F'f1F
⇒F2f1F2
⇒L'F2f1F2L
⇒D'F'f1FD
⇒LR'FLR'DLR'B2L'RDL'RFL'RU2
⇒LFf8F'L'
⇒R'F'f8FR
⇒Ff8F'
⇒F'f8F
⇒ULU'f8UL'U'
⇒U'R'Uf8U'RU
⇒F2f8F2
⇒Df15D'
⇒D'f15D
⇒D2f15D2
⇒UF2UF2D'L2B2U'B2DL2F2D2B2D2F2
⇒U'DL2UD'B2
⇒UF2UF2D'L2B2D'R2UR2F2D2B2U2B2
⇒BL'BU2D2F'RF'U2D2
⇒LD'F2U'B2U'RU2R'F2R2F2D'R2DF2D
⇒B2URB2D2B2RB2U'D'L2D'B2
⇒B2LF'U'B2UFL'R2B2U'D2L2D'B2U
⇒B2RB2D2B2RB2U'L2UD'F2U'F2B2
⇒D2R'FUB2U'F'RU2B2D'F2R2UF2UF2
⇒B2R2U'L'D2B2U2R'U2R2F2L2R2UR2
⇒D2L'B2U2F2RUL2U'F2R2U'R2U2F2DL2D'
⇒UB2U'L2DL2B2DB2D'B2
⇒BR'BL2B'RBL2B2
⇒UF2B2U'F2B2U'F2L2R2B2R2
⇒R2U'F2DR2UF2D'R2DF2R2D'F2
⇒U'F2DF2UL2F2DL2DF2L2D2F2
⇒U2D'L2U'F2L2U'B2L2R2U'L2B2
⇒F2D'R2U2L2B2UF2L2U2F2L2UF2R2
⇒[f1]3
⇒[f2f37]3
⇒[f3f38]3
⇒[f4f39]3
⇒[f5f40]3
⇒[f6f41]3
⇒[f7f42]3
⇒[f8f43]2
⇒[f9f44]2
⇒[f10f45]2
⇒[f11f46]2
⇒[f12f47]2
⇒[f13f48]2
⇒[f14f49]2
⇒[f15f50]2
⇒[f16f51]2
⇒[f17f52]2
⇒[f18f53]2
⇒[f19f54]2
⇒[f20f55]3
⇒[f21f56]4
⇒[f22f57]5
⇒[f23f58]6
⇒[f24f59]7
⇒[f25f60]8
⇒[f26f61]9
⇒[f27f62]9[f27f62]2
⇒[f28f63]9[f28f63]3
⇒[f29f64]9[f29f64]4
⇒[f30f65]2
⇒[f31f66]3
⇒[f32f67]4
⇒[f33f68]5
⇒[f34f69]6
⇒[f35f70]7
rs[f36f71]8

เอาท์พุทถ้าแก้ไขได้: Solved!
เอาท์พุทถ้าแก้ไม่ได้: (ว่างเปล่าไม่มีเอาท์พุท)

อินพุตควรจัดรูปแบบเป็นคิวบ์แบบดัมพ์ (ดูที่Debugส่วน) สิ่งนี้ได้รับอนุญาตอย่างชัดเจนจาก OP

คำอธิบาย

โปรแกรมนี้ใช้วิธีการใช้อัลกอริธึมของ Devilเพื่อวนซ้ำทุกสถานะที่เป็นไปได้ของคิวบ์ในกลุ่มเดียวกันกับคิวบ์ที่ถูกแก้ไข หากลูกบาศก์สามารถแก้ไขได้จะมีการแก้ไขในบางจุดก่อนที่อัลกอริทึมจะเสร็จสิ้น (สมมติว่าอัลกอริทึมที่ฉันใช้ทำงานได้ถูกต้อง)

ทุกบรรทัดที่ขึ้นต้นด้วย(0x84 ในเพจเพจของ Cubically) คือนิยามฟังก์ชัน ฟังก์ชั่นเหล่านี้ประกอบกันขึ้นเป็นอัลกอริทึมของ Devil ที่แท้จริง บรรทัดแรกที่จะดำเนินการคือบรรทัดสุดท้าย:

rs[f36f71]8

rอ่าน cube จาก stdin และตั้งค่า cube หน่วยความจำให้กับมัน sวางล่ามลงใน "สารละลายโหมด" ซึ่งหมายความว่ามันจะออกและพิมพ์Solved!ถ้าก้อนจะกลายเป็นแก้ไข (หลังจากถูกแก้) ในจุดใด ส่วนที่เหลือของคำสั่ง (ซึ่งทำซ้ำเพียงf36f718 ครั้ง) สอดคล้องกับอัลกอริทึมสุดท้ายที่ด้านล่างของหน้าเชื่อมโยง:

(D) = (CP) = (CPT8) = [(CPC8)(CPT7)]8 (3,847,762,288,469,010,006,992 moves)

(D) is the Devil's Algorithm. If you apply it to the cube, it will be solved at some point before you have done the algorithm once. As you can see, it is terribly long, nearly a thousand times more moves than there are possible positions.

ฉันจะรันมันได้อย่างไร

คุณสามารถลองออนไลน์ได้ แต่ลิงค์นั้นใช้ไม่ได้ TIO เกือบจะหมดเวลาก่อนที่อัลกอริทึมนี้จะเสร็จสิ้น (รันไทม์สูงสุดสำหรับล่ามคือ 60 วินาที) หากคิวบ์ไม่สามารถแก้ไขได้อัลกอริทึมนี้จะใช้เวลานานถึง 11 ล้านปีเพื่อให้เสร็จสมบูรณ์แบบลูกบาศก์ (ที่ ~ 15.2 ล้านย้ายต่อวินาทีซึ่งเป็นสิ่งที่Cloud9 IDEของฉันได้รับ)

นอกจากนี้คุณต้องมีหน่วยความจำจำนวนมากเพื่อดำเนินการ 3 ล้านย้าย สามารถเคลื่อนที่ได้ประมาณ 4 ล้านครั้งต่อวินาทีตามลำดับ แต่กระบวนการส่วนใหญ่จะถูกฆ่าเนื่องจากหน่วยความจำที่รับภาระมากเกินไป มันจะตายหลังจาก 15 วินาทีบน VM ของฉันที่มีหน่วยความจำ 512MB เหตุใดจึงควรดำเนินการย้ายในหน่วยความจำต้นทุนแบบแฟลตเรย์ พบว่ามีการรั่วไหลของหน่วยความจำ (หรือยี่สิบ) และคงมัน

นี่คือเวอร์ชันที่อ่านได้มากกว่าซึ่งมีลักษณะเหมือนกัน

แต่ฉันอยากเห็นว่ามันใช้งานได้จริง!

การย้ายครั้งแรกที่เกิดขึ้นจริงในอัลกอริธึมของมารคือF2ดังนั้นคิวบ์ที่เร็วที่สุดที่จะแก้ปัญหาจะถูกแปลงด้วยF2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

นี้แน่นอนดำเนินการใน 0.007 วินาทีใน TIO

สิ่งนี้จะปรับปรุงได้อย่างไร

มีอัลกอริธึมของมารมากขึ้นอย่างแน่นอน ฉันได้พบหนึ่งที่ใช้น้อยกว่าหนึ่งในสามสิบของการเคลื่อนไหวนี้ทำ อย่างไรก็ตามจะมีค่าใช้จ่ายหลายพันไบต์ (ประมาณ 100MB ขึ้นไป) และอีกหลายสิบชั่วโมงในการแปลงวงจร Hamiltonian ที่ซับซ้อนเป็นรหัสแบบลูกบาศก์

นอกจากนี้ยังเป็นไปได้ที่จะลบฟังก์ชั่นบางอย่างออกไป อย่างไรก็ตามฉันจะเสียสละบางไบต์เพื่อให้อ่านง่าย

นอกจากนี้ฉันกำลังพิจารณาการปรับเปลี่ยนพฤติกรรมวนลูปของ Cubically เพื่อให้ฉันสามารถทำซ้ำอัลกอริทึมได้ง่ายขึ้น 7 หรือ 8 ครั้ง (แทนที่จะเป็นฮาร์ดโค้ดด้วยฟังก์ชั่นการโทรซ้ำ 7 หรือ 8 ครั้งในแหล่งที่มา) หรือฉันจะใช้เวทย์มนตร์ร่วมกับ Notepad และเล่นกอล์ฟโดยใช้ลูปเพิ่มเติม

โปรดทราบว่าฉันจะยังคงปรับปรุงสิ่งที่เป็นไปได้ในล่ามต่อไปดังนั้นสิ่งนี้อาจใช้ได้กับพีซีทั่วไปในอนาคต!


ตามอำเภอใจ 2 ไบต์

r▦

ฉันชอบคำตอบข้างต้นดีกว่าดังนั้นฉันจึงเพิ่มนี่เป็นทางเลือกอื่น สิ่งนี้ดำเนินการภายในไม่กี่วินาทีเมื่อเทียบกับไม่กี่ล้านปี

r    read cube from standard in
 ▦   and solve it

เอาต์พุตถ้าคิวบ์แก้ปัญหาได้: (ไม่มีอะไร)
เอาท์พุทถ้าคิวบ์แก้ไม่ได้: Error: The cube has reached an unsolvable state.


มันใช้งานได้ไหมถ้าเราสลับข้างกัน? ตัวอย่างเช่น 2 ตรงข้าม 4 ในการถ่ายโอนข้อมูลคิวบ์จะทำงานได้ไหมถ้า 2 ตรงข้าม 5 และ 4 อยู่ตรงข้าม 0?
ข้าวสาลีตัวช่วยสร้าง

1
@WheatWizard ใช่แล้วจะแก้ปัญหาโหมดตรวจสอบว่าแต่ละใบหน้ามีจำนวนเต็มที่ไม่ซ้ำกันหรือไม่และถ้าจำนวนเต็มนั้นเป็นเพียงใบหน้าเดียว
MD XF

ตกลงตามที่ควร ฉันไม่คุ้นเคยกับผู้มีเหตุผลพอที่จะรู้ว่านี่เป็นกรณีหรือไม่จากคำอธิบายของคุณ
ข้าวสาลีตัวช่วยสร้าง

@WeatWizard เพียงแค่ทำให้แน่ใจว่าฉันเข้าใจคุณอย่างถูกต้อง - นี่คือ (ตามแนว) สิ่งที่คุณพูดถึงนั่นถูกต้องหรือไม่
MD XF

ใช่. และควรแก้ไขได้
ข้าวสาลีตัวช่วยสร้าง

4

APL (Dyalog Classic) , 190 174 ไบต์

{∧/~∊(×1 2 3|+.-⌿↑⊃∘⍋¨¨¨a)({2|≢∪{⍵⌊⍵[⍵]}⍣≡⍵,0}¨⍳⌿↑⌽b)((∪≢∩)¨/b←(⊃∘⍋⌽⊢)¨¨¨a),6≢≢∪⊃⊃a←{c4⍴⊂⍬⋄c[+/1≠i],←(≠/×i←↑⍳33){⊂⌽⍣⍺⊢⍵~' '}¨,⌿(3|∘.+⍨⍳3)⍉⍤¯11 0 1\⍵1c}¨⍵(3 3∘⍴¨1 1∘⌷¨⍵)}

ลองออนไลน์!

อาร์กิวเมนต์เป็นเมทริกซ์ 3x2 (แถว 0: ด้านหน้าด้านหลัง, แถว 1: ซ้ายขวา, แถว 2: ขึ้นลง) ของเมทริกซ์อักขระ 3x3 ส่งคืน 1 สำหรับลูกบาศก์ของรูบิคที่แก้ไขได้มิฉะนั้นเป็น 0

ในลิงก์ TIO ฟังก์ชั่นtซึ่งไม่รวมอยู่ในจำนวนตัวอักษรอ่านอินพุต 9 บรรทัดแปลงจากรูปแบบอินพุตเริ่มต้น (สุทธิ) ไปเป็นเมทริกซ์ 3x2 x 3x3 ที่ต้องการเรียกโซลูชันและพิมพ์ตกลงหากผลลัพธ์ เป็นไปตามที่คาดไว้

อัลกอริทึมจะแยกคิวบ์ที่กำหนดออกเป็น 26 cubies - สตริงที่มีความยาว 3 (มุม), 2 (ขอบ) และ 1 (กึ่งกลาง) มันยังสร้าง 26 คิวบ์ของคิวบ์ที่ถูกแก้ไขด้วย 6 cubies กลางเดียวกัน ต้องตรงตามเกณฑ์ต่อไปนี้ทั้งหมด:

  • ไม่มีการซ้ำซ้อนระหว่าง 6 ศูนย์

  • ชุดของcubie ที่กำหนด / ที่ถูกแก้ไขตรงกันมากถึงการหมุน - เช่นพิจารณา'WBR'และ'BRW'cubie เดียวกัน แต่ไม่ใช่'BWR'

  • ความเท่าเทียมกันของทั้งการเปลี่ยนแปลงมุมและการเปลี่ยนแปลงขอบ

  • แบบโมดูโล-3 ผลรวมของมุมดัชนีหมุน (เช่นการ "เล็กที่สุด" จดหมายBเป็นจุดอ้างอิงเรามี: 'BRW'→0, 'WBR'→1, 'RWB'→2) การแข่งขันระหว่างก้อนที่กำหนดและแก้ไข; แบบเดียวกันกับมุมโมดูโล 2

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