การเปลี่ยนลำดับ 43 ล้านล้าน


16

เราสามารถแสดงCube ของ Rubikเป็นเน็ตดังนี้ (เมื่อแก้ไข):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

ตัวอักษรแต่ละตัวแทนสีที่สอดคล้องกัน ( Wเป็นสีขาวGสีเขียวและอื่น ๆ )

มันแสดงให้เห็นว่ามี43,252,003,274,489,856,000 (~ 43 ) การเรียงสับเปลี่ยนที่ลูกบาศก์รูบิคสามารถอยู่ได้

งานของคุณคือการใช้จำนวนเต็มระหว่าง1และ43,252,003,274,489,856,000และส่งออกการเปลี่ยนแปลงที่สอดคล้องกันในลักษณะที่แสดงข้างต้น คุณสามารถเลือกวิธีเรียงลำดับเรียงสับเปลี่ยนได้ แต่อัลกอริทึมที่คุณใช้จะต้องแสดงเพื่อสร้างการเรียงสับเปลี่ยนที่ไม่ซ้ำกันและถูกต้องสำหรับอินพุตที่เป็นไปได้แต่ละรายการ

กฎการเปลี่ยนแปลงที่ไม่ถูกต้อง

นำมาจากหน้านี้

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

ถ้าเราบอกว่าการเรียงสับเปลี่ยนแต่ละครั้งมีความเท่าเทียมกันตามจำนวนของการแลกเปลี่ยนเพื่อให้ได้การเปลี่ยนแปลงนั้นเราสามารถพูดได้

  • แต่ละชิ้นส่วนมุมมีสามทิศทางที่เป็นไปได้ สามารถวางแนวได้อย่างถูกต้อง (0), ตามเข็มนาฬิกา (1) หรือทวนเข็มนาฬิกา (2) ผลรวมของการหมุนมุมจะยังคงหารด้วย 3 เสมอ

  • การหมุนตามกฎหมายแต่ละครั้งบนลูกบาศก์ของรูบิคจะพลิกขอบจำนวนคู่เสมอดังนั้นจะต้องมีชิ้นส่วนที่ไม่ถูกต้อง

  • เมื่อพิจารณาถึงการเปลี่ยนแปลงของมุมและขอบทั้งหมดความเท่าเทียมกันโดยรวมจะต้องเป็นแบบเดียวกันซึ่งหมายความว่าการเคลื่อนไหวทางกฎหมายแต่ละครั้งจะดำเนินการเทียบเท่ากับจำนวนครั้งที่เท่ากัน (ละเว้นการวางแนว)

ตัวอย่างเช่นสามสุทธิต่อไปนี้เป็นผลลัพธ์ที่ไม่ถูกต้อง:

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

กฎระเบียบ

  • คุณต้องพิสูจน์อย่างไรก็ตามวิธีที่คุณต้องการว่าอัลกอริทึมนั้นถูกต้อง คุณไม่จำเป็นต้องระบุการเปลี่ยนแปลงทุกครั้งตราบใดที่คุณพิสูจน์ความถูกต้องของอัลกอริทึมของคุณ
  • 143,252,003,274,489,856,000
    • 253-1253-1
    • 27,946,105,037,114,827,095
  • คุณต้องรวมหลักฐานการมีผลในคำตอบของคุณ หลักฐานนี้สามารถพิสูจน์ความถูกต้องในวิธีการพิสูจน์ที่ยอมรับยกเว้นการแจกแจงความเป็นไปได้ทั้งหมด
  • คุณสามารถเลือกใช้วิธีป้อนข้อมูลแบบอื่นได้หากต้องการตราบใดที่:
    • อินพุตถูก จำกัด ขอบเขต
    • แต่ละอินพุตสอดคล้องกับเอาต์พุตเฉพาะ
    • คุณอธิบายรูปแบบการป้อนข้อมูลอย่างชัดเจนและสอดคล้องกับแต่ละเอาต์พุตอย่างไร
  • คุณสามารถเปลี่ยนอักขระที่ใช้ในการใช้อักขระ ASCII ที่แตกต่างกัน 6 ตัวระหว่าง 33 ( !) ถึง 126 ( ~) แทนWGRBOY
  • คุณสามารถแสดงผลในลักษณะใดก็ได้ที่คุณต้องการตราบใดที่มันเป็นตัวแทนของคิวบ์ที่ชัดเจนซึ่งใบหน้าทั้ง 6 ใบหน้าสามารถที่จะแสดงรวมถึงคิวบ์สุทธิที่ถูกต้องสตริงที่มีเส้นเดี่ยวหรือการเรนเดอร์ 3D หากคุณไม่แน่ใจเกี่ยวกับรูปแบบเฉพาะอย่าลังเลที่จะถามในความคิดเห็น

นี่คือดังนั้นรหัสที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาชนะ

ตัวอย่างผลลัพธ์ที่ถูกต้อง

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)

ในตัวอย่างที่ไม่ถูกต้องครั้งที่สามไม่ใช่แค่ว่ามุมอยู่ในการกำหนดค่าที่ไม่ถูกต้องมุม r / y / o เป็นมุมที่เป็นไปไม่ได้เนื่องจาก r และ o อยู่ตรงข้ามกัน
fəˈnɛtɪk

แก้ไขตัวอย่างที่ไม่ถูกต้องที่สาม (CC @ fəˈnɛtɪk)
Jonathan Allan

ปัญหาเดียวกันก็เป็นตัวอย่างที่ไม่ถูกต้องที่สอง แต่ฉันไม่ได้สังเกตเห็น มันมีความสำคัญน้อยกว่าเพราะสีจะ
เลอะ

(a1,a2,a3,a4)a18!a237a312!/2a4211

1
@Shaggy ใช่สตริงบรรทัดเดียว
ใช้ได้

คำตอบ:


13

ถ่าน , 334 297 ไบต์

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

qการป้อนข้อมูลลงในจำนวนเต็มตัวแปร

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

แบ่งโดย3⁷วางที่เหลือในq eจากนั้นเมื่อพิจารณาeว่าเป็นตัวเลขในฐาน 3 ต่อท้ายตัวเลขหลักเพื่อeให้ตัวเลข (ในฐาน 3) รวมกันเป็นทวีคูณของ 3 ซึ่งจะช่วยeกำหนดการหมุนของมุม

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

แบ่งq8 !, zวางที่เหลือใน (8! ถูกเก็บไว้ชั่วคราวdเพื่อบันทึกไบต์) ช่วยให้zสามารถกำหนดตำแหน่งของมุมได้

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

หารqด้วย2¹¹แล้ววางส่วนที่เหลือhลง จากนั้นเมื่อพิจารณาhเป็นตัวเลขในฐาน 2 ต่อท้ายตัวเลขเพื่อhให้ตัวเลข (ในฐาน 2) เพิ่มขึ้นเป็นทวีคูณของ 2 ซึ่งจะช่วยให้hการกำหนดพลิกของขอบ

F⪪”B"↷:μêKO″KW#})”³

วนซ้ำผ่านสายอักขระของศูนย์

«J⌕α§ι⁰I§ι¹§ι²»

ข้ามไปที่ตำแหน่งของแต่ละศูนย์และพิมพ์

≔⁰ω

wติดตามความเท่าเทียมกันในตำแหน่งมุมในตัวแปร

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

สร้างอาร์เรย์ของตำแหน่งมุม

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

สร้างอาร์เรย์ของสีมุม

F²«

วนซ้ำสองครั้งครั้งหนึ่งสำหรับมุมหนึ่งครั้งสำหรับขอบต่อไปนี้จะเรียกว่า "คิวบ์"

Fδ«

วนลูปมากกว่าอาร์เรย์ของสีลูกบาศก์

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

สารสกัดจากตำแหน่งก้อนต่อไปจากการปรับปรุงความเท่าเทียมกันในz wใช้พาริตีนี้สำหรับสุดท้าย แต่หนึ่งขอบ สิ่งนี้ทำให้มั่นใจได้ว่าผลรวมของความเท่าเทียมกันของขอบและมุมจะเท่ากัน

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

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

≧÷Lκε»

eนำการหมุนหรือพลิกจาก

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

สร้างอาร์เรย์ของตำแหน่งขอบ นี่จะถูกใช้เป็นครั้งที่สองผ่านลูป

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

สร้างชุดสีขอบ

≔θζ≔ηε

เขียนทับตัวแปรมุมzและeด้วยตัวแปรขอบที่สอดคล้องกันqและhเพื่อให้ขอบดัดและพลิกระหว่างการผ่านรอบที่สองของลูป


ให้คำแนะนำกับตัวเอง:หากสิ่งที่ golfed ใน Charcoal เป็น 330 ไบต์ไม่ลองใน PHP!
กลางคืน 2

@ Night2 น่าเศร้า 334 ในขณะนี้เนื่องจากข้อผิดพลาด (การคำนวณความเท่าเทียมกันไม่ถูกต้อง)
Neil

8

Ruby , 570 408 ไบต์

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

ลองออนไลน์!

รุ่นดั้งเดิมพร้อมอาร์เรย์ของตัวเลขเวทย์มนตร์แทนสายเวท

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

ลองออนไลน์!

ฟังก์ชันที่ไม่ระบุตัวตนซึ่งอยู่ในรูปแบบปัจจุบันจะรับอินพุตเป็นจำนวนเต็มสองจำนวนซึ่งดูเหมือนว่าจะได้รับอนุญาต: "คุณสามารถเลือกวิธีป้อนข้อมูลแบบอื่นได้" ที่แรกก็คือการเปลี่ยนแปลงในช่วง 0 ถึง12!*8!/2 - 1และสองคือการวางแนวของชิ้นส่วนที่อยู่ในช่วง 0 2**11 * 3*7 - 1ไปยัง เอาต์พุตในสถานะที่แก้ไขคือสตริงต่อไปนี้:

000
000
000
222333444555
222333444555
222333444555
111
111
111

การเล่นกอล์ฟต่อไป

มีตัวอักษรเพิ่มเติมอีกประมาณ 10 ตัวที่จะบันทึกโดยการปรับรูปแบบผลลัพธ์เป็นรูปร่างต่อไปนี้ แต่สิ่งนี้จะลดความสามารถในการอ่านได้ดังนั้นฉันจะไม่ทำมันในปัจจุบัน

      #########
      #########
      #########
#########
#########
#########

คำอธิบาย

การเปลี่ยนแปลง

aภายในรัฐแก้ไขจะถูกแทนด้วยชุดของตัวเลขฐานแปดในอาร์เรย์ การป้อนข้อมูลgโดยแบ่งเป็นตัวเลขที่12..1มีโมดูลัสที่ใช้ในการเลือกและลบจากขอบและวางไว้ในa zเมื่อดำเนินการเสร็จแล้วจะมีเพียงมุมที่เหลือaเท่านั้นดังนั้นgจะถูกหารด้วยตัวเลข8..1โดยใช้โมดูลัสที่ใช้ในการลบมุมออกazและวางไว้ใน

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

ปฐมนิเทศ

มีหลายวิธีในการตัดสินใจว่ามุมหรือขอบอยู่ในทิศทางที่ถูกต้องหากไม่ได้อยู่ในตำแหน่งที่ถูกแก้ไข สำหรับจุดประสงค์ของคำตอบนี้มุมจะถูกพิจารณาในทิศทางที่ถูกต้องหากมีการแสดง0หรือ1บนใบหน้าด้านบนหรือด้านล่าง ดังนั้นการหมุนใบหน้าด้านบนหรือด้านล่างจึงไม่เปลี่ยนการวางแนวมุม การหมุนใบหน้าอื่น ๆ จะเปลี่ยนการวางแนว แต่ในลักษณะที่ผลรวมของความเท่าเทียมกันโดยรวมยังคงไม่เปลี่ยนแปลง ขอบถูกพิจารณาในทิศทางที่ถูกต้องหากพวกเขาแสดง2หรือ4ไปที่ด้านหน้า / ด้านหลังหรือ a 3หรือ5ไปทางซ้าย / ขวา ซึ่งหมายความว่าการหมุนของด้านบนหรือด้านล่างทีละหนึ่งครั้งจะพลิกทั้งสี่ด้าน แต่การหมุนของใบหน้าอื่น ๆ จะทำให้สถานะการพลิกไม่เปลี่ยนแปลง

อินพุตมีข้อมูลที่ชัดเจนสำหรับทุกคนยกเว้นขอบแรกและมุมสุดท้าย 11 บิตที่มีนัยสำคัญน้อยที่สุดh%2048จะถูกรวมและโมดูลัสที่ใช้ในการกำหนดทิศทางของขอบแรก hจะถูกคูณด้วย 2 โดยการเพิ่มเข้าไปในตัวเองและเพิ่มค่าสำหรับการวางแนวของขอบแรกเป็นบิตที่สำคัญน้อยที่สุด การวางแนวของมุมสุดท้ายพบได้โดยการลบการวางแนวของมุมอื่น ๆjอย่างต่อเนื่อง สำหรับมุมสุดท้าย (โดยที่i/19= 1) ค่าของj%3จะถูกเพิ่มเข้าไปh(ซึ่งจะถูกลดลงเหลือศูนย์) และสิ่งนี้จะกำหนดทิศทางของมุมสุดท้าย

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

แสดง

ในที่สุดสติ๊กเกอร์ดิบจะถูกคัดลอกมาจากbรูปแบบที่มนุษย์อ่านได้มากขึ้นในการsใช้ตัวเลขเวทย์มนตร์ในตารางดัชนี

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