ลำดับตัวตนของ Cube ของ Rubik


32

ลำดับการเคลื่อนย้ายเป็นลำดับของการเคลื่อนไหว (รอบ) บนลูกบาศก์ของรูบิค (สำหรับสัญกรณ์ดูลงด้านล่าง) ข้างลำดับเคลื่อนย้ายที่ว่างเปล่ามีลำดับการย้ายอื่น ๆ อีกมากมายที่ไม่มีผลกระทบกับคิวบ์เลย เราเรียกลำดับลำดับการย้ายเหล่านี้

บางส่วนของลำดับตัวตนเหล่านี้มีความชัดเจนในการตรวจสอบเช่นหรือU2 R R' U2 U D2 U' D2ในครั้งแรกหนึ่งสองย้ายแบบสุ่มจะทำและหลังจากนั้นทันทียกเลิกU2 R R' U2คนที่สองคล้ายกัน การสุ่มสองครั้งแรกU D2และหลังจากนั้นจะถูกยกเลิก แต่ในลำดับที่กลับU' D2ด้าน สิ่งนี้ใช้ได้ผลเพราะการเคลื่อนไหวมีUผลต่อชิ้นส่วนของชั้นบนD2เท่านั้นและการเคลื่อนย้ายจะส่งผลเฉพาะส่วนของชั้นล่างเท่านั้น คุณสามารถเห็นการสร้างภาพของลำดับการเคลื่อนที่ทั้งสองนี้

U2 RR 'U2 คุณ D2 U 'D2

ลำดับตัวตนอื่น ๆ อาจไม่ชัดเจนเลย R' U' R' F' U F U' R' F R F' U' R U2 Rยกตัวอย่างเช่นลำดับ มันค่อนข้างยาว แต่ก็ไม่มีผลกับลูกบาศก์เลย

ป้อนคำอธิบายรูปภาพที่นี่

ย้ายสัญลักษณ์

การเคลื่อนย้ายอธิบายถึงการหมุนหนึ่งชั้นของหนึ่งในหกใบหน้าของคิวบ์ การเคลื่อนที่ประกอบด้วยตัวอักษรหนึ่งตัวที่เป็นตัวแทนของใบหน้าตามด้วยคำต่อท้ายที่เป็นตัวเลือกที่แสดงถึงมุมเลี้ยว

ตัวอักษรและใบหน้าที่เกี่ยวข้องคือU (ขึ้น - ด้านที่หันขึ้นด้านบน), D (ลง - ด้านที่หันลงด้านล่าง), R (ขวา - ด้านที่หันไปทางขวา), L (ซ้าย - ด้านที่หันไปทางซ้าย) , F (ด้านหน้า - ด้านที่หันหน้าเข้าหาคุณ) และB (ด้านหลัง - ด้านที่หันหน้าไปทางคุณ)

หากไม่มีคำต่อท้ายใบหน้าจะหมุนตามเข็มนาฬิกา 90 องศาคำต่อท้าย'หมายถึงใบหน้าหัน 90 องศาทวนเข็มนาฬิกาและคำต่อท้าย2หมายถึงใบหน้าหันตามเข็มนาฬิกา 180 องศา

คุณมีปัญหากับสัญกรณ์เพียงแค่ใช้http://alg.cubing.netซึ่งคุณสามารถเห็นภาพลำดับการเคลื่อนที่ดังกล่าว

ความท้าทาย

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

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ มันควรจะได้รับสตริงที่มีลำดับการย้าย (การย้ายถูกคั่นด้วยช่องว่าง) เป็นอินพุต (ผ่าน STDIN, อาร์กิวเมนต์บรรทัดคำสั่ง, พร้อมท์หรืออาร์กิวเมนต์ของฟังก์ชัน) และเอาต์พุต (ผ่านค่าส่งคืนหรือ STDOUT) ค่าบูลีนหรือจำนวนเต็ม True - 1 - identity identity / False - 0 - ไม่ใช่ identity identity)

หากคุณต่อท้าย'สร้างปัญหาในภาษาการเขียนโปรแกรมของคุณคุณอาจใช้สัญลักษณ์ที่แตกต่างกัน แต่ไม่ใช่ตัวเลข R F2 U3ไม่อนุญาต

นี่คือ codegolf ดังนั้นรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False

มีอะไรผิดปกติกับR F2 U3?
John Dvorak

2
ฉันแค่ต้องการทำให้แน่ใจว่าทุกคนมีเงื่อนไขที่เหมือนกัน ถ้าฉันยอมU3คุณก็สามารถโยนคำต่อท้ายเป็นตัวเลขได้
Jakube

3
ฉันคุ้นเคยกับสัญกรณ์ที่ใช้ T-Top, B-Bottom และ P-Posterior (ด้านหลัง) มากกว่า R2 D2คนอาจจะเพียงแค่ชอบเห็นลำดับ
mbomb007

2
@ mbomb007 ฉันสามารถเข้าใจ T ด้านบน แต่ฉันไม่เคยเห็น P สำหรับคนหลังและฉันจะไม่เข้าใจความหมายของมันถ้าไม่ใช่ความคิดเห็นของคุณ ...
John Dvorak

2
@ mbomb007 ฉันได้เห็นสัญกรณ์นั้นด้วยเหมือนกัน แต่มันก็ไม่ได้เป็นเรื่องธรรมดาหรือเก่าแก่เหมือนต้นฉบับของ Singmaster และฉันไม่รู้ว่าทำไมคนถึงอยากยุ่งกับต้นฉบับ แม้ว่า David Singmaster (เท่าที่ฉันรู้) ไม่ได้กล่าวถึง แต่ฉันได้สังเกตว่าใบหน้าทั้งหมดสอดคล้องกันอย่างสมบูรณ์และไม่มีการปะทะหากพิจารณาว่าเป็นทิศทางมากกว่าตำแหน่ง That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
ระดับแม่น้ำ St

คำตอบ:


14

Haskell, 263 261 247 243 ตัวอักษร

c[x]=[x]
c(x:"2")=[x,x]
c(x:_)=[x,x,x]
s!a@[x,y,z]=case s of
 'R'|x>0->[x,-z,y]
 'B'|y>0->[z,y,-x]
 'U'|z>0->[-y,x,z]
 'L'|x<0->[x,z,-y]
 'F'|y<0->[-z,y,x]
 'D'|z<0->[y,-x,z]
 _->a
r=[-2..2]
i=mapM id[r,r,r]
f w=i==foldr(map.(!))i(c=<<words w)

อัลกอริทึมค่อนข้างตรงไปตรงมา; แต่ละ cubelet ทำจาก 1,2,4 หรือ 8 ชิ้นทำการเข้ารหัสตำแหน่งและทิศทางของมัน 4 ชิ้นต่อลูกบาศก์ขอบ, 8 ต่อลูกบาศก์มุม, 7 ลูกบาศก์อยู่กับที่

c Homps พระวจนะของใส่ลงในลำดับของการผลัด CW ที่ในแต่ละครั้งและ!ส่งแต่ละก้อนตามการเปิด iเป็นตำแหน่งทันตกรรมของฉัน fเป็นหลักตื่นเต้น

ฉันไม่พอใจกับcฟังก์ชั่น homp มากเกินไปแต่ฉันไม่สามารถหาวิธีที่จะทำให้สั้นลงได้ (@Nimi ทำเช่นนั้น)


วิธีการเกี่ยวกับและc(x:"2")=[x,x] c(x:_)=[x,x,x]บันทึก 2 ไบต์
nimi

หากคุณใช้i=sequence[s,s,s]และเปลี่ยนสิ่งอันดับทั้งหมดเป็นรายการ (เช่น: (x,y,z)กลายเป็น[x,y,z]) - มันจะประหยัดได้ ~ 9 ตัวอักษร การฝังไว้จะช่วยประหยัดได้อีก 4 รายการ วาง_กรณีจาก!บันทึกอีก 11
MtnViewMark

@MtnViewMark เสร็จแล้วและได้รับการปรับปรุงiขอบคุณ ไม่แน่ใจว่าสิ่งที่คุณหมายถึง inlining i- fโปรดทราบก็จะปรากฏขึ้นสองครั้งในคำนิยามสำหรับ ไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยการวาง_กรณี - _->aออกอย่างสมบูรณ์หรือย้ายไปด้านบนให้ข้อยกเว้นรูปแบบที่ไม่ครบถ้วนสมบูรณ์และการย้ายไปด้านบนไม่ได้บันทึกตัวละครใด ๆ อย่างไรก็ตามฉันสามารถบันทึกตัวละครได้ 5 ตัวอย่างไรก็ตาม
John Dvorak

ทางออกที่ดี ฉันตรวจสอบกรณีทดสอบทั้งหมด
Jakube

ขอแสดงความยินดีกับโซลูชันของคุณอีกครั้ง เมื่อคุณแสดงรหัสที่สั้นที่สุดคุณจะได้รับชื่อเสียง 100 รางวัล
Jakube

4

Cubically , 6 4 ไบต์

¶=8%

ฉันชนะ: พี

¶=8%
¶     read a string, evaluate as Cubically code
 =8   set notepad to (notepad == 8th face)
   %  print notepad

แผ่นจดบันทึกถูกเตรียมใช้งานเป็นศูนย์ "ใบหน้า" อันดับที่ 8 มี 1 หากลูกบาศก์ไม่ได้ถูกแก้และ 0 เป็นอย่างอื่น

ลองออนไลน์!


3
ดูเหมือนว่าภาษาที่น่าสนใจ แต่เนื่องจากภาษาถูกสร้างขึ้นหลังจากการโพสต์ความท้าทายจึงไม่มีสิทธิ์ชนะ
Jakube

2
@Jakube ฉันยอมรับว่าไม่ควรยอมรับเพราะข้อเท็จจริงที่ว่ามันเป็นภาษาที่มีคิวบิกของ Rubik โพสต์ในช่วงหลังความท้าทายและกำจัดคำตอบอื่น ๆ ทั้งหมด แต่มีคุณสมบัติทางเทคนิคในการชนะตามเมตาดาต้า (กฎที่ไม่ได้แข่งขันถูกเพิกถอนบ้าง)
MD XF

3

J - 232, 220, 381, 315 296 ไบต์

โซลูชันนี้เข้ารหัสการทำงานทั้งหมดเป็นการเปลี่ยนรูปใบหน้าและทำงานตามความจริงที่ว่าการบิดใบหน้าทั้งหมดเหมือนกันจริง ๆ ภายใต้การหมุนของคิวบ์ทั้งหมด

แก้ไข : เล่นกอล์ฟเพิ่ม

f=:+/~6&*
r=:4 :'y f&.>(]{^:x~)&.C.;/i.2 4'"0
t=:((r~0),_4<\44#.inv 1478253772705907911x)&C.&.
Y=:(C.(,0 2 r 4 5),;/4 f&i.8)&{^:t
X=:((,1 1 0 2 r 2 4 3 1)C.C.;/0 4 2 5 f i.8)&{^:t
61".@A."1'=: ',"#~6 3$'D0XR1YF1XU2YB3XL3Y'
T=:[:(_2".@}.'(i.48)-:'&(,,[))[:(,'^:',])/&.>@|.&.;:[:''''&=@{.`]},:&'3'

นอกเหนือจากการลองครั้งก่อนหน้านี้จะคำนึงถึงการหมุนมุมด้วย

fเป็นเพียงฟังก์ชั่นตัวช่วย rการหมุนหน้าเดียว ใบหน้าถูกเข้ารหัสดังนี้:

  1. ทุกมุมในขั้นตอนที่ 6
  2. ขอบทั้งหมดในขั้นตอนหก

คำสั่งนี้อำนวยความสะดวกในการเข้ารหัสการหมุนและการบิด tเป็นคำวิเศษณ์ที่บิดใบหน้าภายใต้การหมุนลูกบาศก์หนึ่งการเลือกใบหน้า

XและYเป็นคำวิเศษณ์ที่ใช้อาร์กิวเมนต์เป็นจำนวนซ้ายในทิศทางของลูกบาศก์ทั้งหมด

บรรทัดถัดไปกำหนดการหมุนทั้งหมด: 3 ตัวอักษรต่อการหมุน: ชื่อจำนวนการหมุนและทิศทาง

บรรทัดสุดท้ายจะกำหนดคำกริยาการทดสอบTแปลง 3 และ'เป็นสัญกรณ์พาวเวอร์หมุนลำดับของการดำเนินการต่อท้ายเวกเตอร์ทดสอบ

รายละเอียดเพิ่มเติมตามคำขอ

tests =: (] ;. _2) 0 : 0

 U2 R R' U2
 U D2 U' D2
 U2 R2 R'
 R' U' R' F' U F U' R' F R F' U' R U2 R
 L'
 B B2 B' B2
 D D2 D'
 R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'
 D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'
 B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2
 R U2 R' U R' U2 R U2 R U R' U' R' U R U2
 U F B' R' U F' R U' F' B L U' F L'
 R2 U' R' U' R U R U R U' R
 R' F R' B2 R F' R' B2 R2
)
res =: 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
res ([,],:=) T"1 tests NB. passes all tests.
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

NB. some handy display methods:
dispOrig=: (". ;._2) 0 :0
   _   _   _   5  29  11   _   _   _   _   _   _
   _   _   _  47  _1  35   _   _   _   _   _   _
   _   _   _  23  41  17   _   _   _   _   _   _
   3  27   9   0  24   6   1  25   7   2  26   8
  45  _3  33  42  _6  30  43  _5  31  44  _4  32
  21  39  15  18  36  12  19  37  13  20  38  14
   _   _   _   4  28  10   _   _   _   _   _   _
   _   _   _  46  _2  34   _   _   _   _   _   _
   _   _   _  22  40  16   _   _   _   _   _   _
)
ind =: dispOrig i.&, i. 48 NB. indices of i.48 in the original display

disp =: (9 12$(,dispOrig) ind}~ ])
changed =: 1 : '(u ~:&disp ]) i.48' NB. use to debug permutation verbs: L ch
vch =: 1 :'disp  ((]+_*=) u)'
NB. viewmat integration RGB
cm =: 255 * 1 0 0 , 1 1 1, 0 1 0, 1 1 0, 1 0.5 0, 0 0 1,: 0 0 0 NB. colormap
NB. use as:  "cube i. 48" for seeing a nice folded out cube.
cube =: cm viewmat (>&7 + >&15 + >&23 + >&31 + >& 39 + >&47)@|@disp@]

11
"เนื่องจากผลการทดสอบของฉันไม่ตรงกับที่ให้ ... " ในขณะที่โซลูชันของคุณไม่ทำงาน ฉันจะไม่โพสต์ไว้แล้ว ...
จอห์น Dvorak

คุณถูก. แก้ไขทันที
jpjacobs

ฉันเพิ่ม 4 กรณีทดสอบเพิ่มเติม พวกเขาสองคนยังคงส่งคืนผลลัพธ์ที่ผิดพลาด ดูเหมือนว่าคุณไม่สนใจการวางแนวของมุม
Jakube

@jpjacobs มีตัวแทน 100 ค่าหัวให้กับคำถามในขณะนี้ ต้องการแก้ไขรหัสของคุณหรือไม่
Jakube

Voila เสร็จแล้ว ตอนนี้เพียงลด
jpjacobs

2

Python 3: 280 ตัวอักษร

นี่ไม่ใช่ผู้เข้าร่วมในการท้าทาย ประการแรกเพราะฉันถามความท้าทายด้วยตัวเองและข้อสองเพราะไม่ใช่รหัสของฉัน เครดิตทั้งหมดเป็นของStefan Pochmannผู้ค้นพบวิธีที่ยอดเยี่ยมในการจำลอง Rubik's Cube ฉันเล่นกอล์ฟบ้างและมีการเปลี่ยนแปลงเล็กน้อยเกี่ยวกับความท้าทาย

def f(a):
 s=t="UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR".split()
 for m in a.split():q="FLBR FRBL FDBU FUBD URDL ULDR".split()['UDLRFB'.index(m[0])];n=2+"2'".find(m[-1]);s=[[p,p.translate(str.maketrans(q,q[n:]+q[:n]))][m[0]in p]for p in s]
 return s==t

แนวคิดเบื้องหลังนี้มีดังต่อไปนี้ sแทนตำแหน่งของชิ้นส่วนของUF, URและอื่น ๆ ตัวอย่างเช่น: s = ['DF', 'BL', ...]หมายความว่าชิ้นส่วนUFอยู่ที่ตำแหน่งDFชิ้นส่วนURอยู่ที่ตำแหน่งBL...

ตำแหน่งของชิ้นส่วนเปลี่ยนแปลงได้อย่างไรเมื่อเคลื่อนไหว หากคุณทำU-move สติกเกอร์ (สี) ทั้งหมดของU-layer ที่หันหน้าไปทางด้านหน้าให้เลื่อนไปทางซ้าย สติกเกอร์ด้านซ้ายหันหน้าไปทางด้านหลังทางขวาและทางด้านหน้า FLBRเข้ารหัสโดย ตัวอย่างบางส่วน: UFย้ายไปUL, UFRย้ายไปULFและอื่น ๆ ดังนั้นการใช้การย้ายจึงเป็นเพียงการแปลใบหน้าของชิ้นส่วนในเลเยอร์ที่สอดคล้องกัน

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