43 triệu hoán vị


16

Chúng ta có thể biểu diễn một khối Rubik như một mạng như sau (khi được giải):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

Mỗi chữ cái đại diện cho màu tương ứng ( Wlà trắng, Gxanh lục , v.v.)

đã được chỉ ra rằng có chính xác 43,252,003,274,489,856,000 (~ 43 triệu) các hoán vị khác nhau mà một khối Rubik có thể có.

Nhiệm vụ của bạn là lấy một số nguyên trong khoảng từ 1 đến 43,252,003,274,489,856,000 và đưa ra hoán vị tương ứng, theo cách hiển thị ở trên. Bạn có thể chọn cách hoán vị được sắp xếp, nhưng thuật toán bạn sử dụng phải được hiển thị để tạo ra một hoán vị duy nhất và chính xác cho mỗi đầu vào có thể.

Quy tắc hoán vị không hợp lệ

Lấy từ này trang

Để bắt đầu, trung tâm của mỗi mặt 3x3 phải giữ nguyên, vì hình vuông trung tâm trên khối Rubik không thể xoay được. Toàn bộ khối có thể được xoay, thay đổi vị trí của một khuôn mặt, nhưng điều này không ảnh hưởng đến mạng của khối.

Nếu chúng ta nói mỗi hoán vị có một chẵn lẻ, dựa trên tính chẵn lẻ của số lần hoán đổi để đạt được hoán vị đó, chúng ta có thể nói

  • Mỗi mảnh góc có ba định hướng có thể. Nó có thể được định hướng chính xác (0), theo chiều kim đồng hồ (1) hoặc ngược chiều kim đồng hồ (2). Tổng các hướng của góc luôn chia hết cho 3

  • Mỗi vòng quay hợp pháp trên Cube của Rubik luôn lật một số cạnh chẵn, do đó không thể chỉ có một mảnh được định hướng sai.

  • Xem xét hoán vị của tất cả các góc và cạnh, tính chẵn lẻ phải đồng đều, điều đó có nghĩa là mỗi bước di chuyển hợp pháp luôn thực hiện tương đương với số lần hoán đổi chẵn (bỏ qua định hướng)

Ví dụ: ba mạng sau đây là đầu ra không hợp lệ:

   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)

Quy tắc

  • Tuy nhiên, bạn phải chứng minh rằng thuật toán này hợp lệ. Bạn không cần phải liệt kê từng hoán vị, miễn là bạn chứng minh tính hợp lệ của thuật toán của mình.
  • 143,252,003,274,489,856,000
    • 253-1253-1
    • 27,946,105,037,114,827,095
  • Bạn phải bao gồm một số loại bằng chứng về tính hợp lệ trong câu trả lời của bạn. Bằng chứng này có thể chứng minh tính hợp lệ trong bất kỳ phương pháp chứng minh nào được chấp nhận, ngoại trừ việc liệt kê tất cả các khả năng.
  • Bạn có thể chọn sử dụng phương thức nhập thay thế nếu muốn, miễn là:
    • Đầu vào bị giới hạn
    • Mỗi đầu vào tương ứng với một đầu ra duy nhất
    • Bạn giải thích rõ ràng định dạng đầu vào và cách nó tương ứng với từng đầu ra
  • Bạn có thể thay đổi các ký tự được sử dụng để sử dụng 6 ký tự ASCII khác nhau, giữa 33 ( !) và 126 ( ~), thay vìWGRBOY
  • Bạn có thể xuất ra theo bất kỳ cách nào bạn muốn, miễn là nó tạo thành một đại diện rõ ràng của một khối trong đó tất cả 6 mặt có thể được hiển thị, bao gồm bất kỳ mạng khối hợp lệ nào, một chuỗi xếp hàng đơn hoặc kết xuất 3D. Nếu bạn không chắc chắn về một định dạng cụ thể, đừng ngần ngại hỏi trong các bình luận.

Đây là một để mã ngắn nhất, tính bằng byte, trong mỗi ngôn ngữ sẽ thắng.

Ví dụ đầu ra hợp lệ

   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)

Trong ví dụ không hợp lệ thứ ba, không phải là góc nằm trong cấu hình không hợp lệ, góc r / y / o là góc không thể do r và o đối diện nhau
fəˈnɛtɪk

Đã sửa ví dụ không hợp lệ thứ ba (CC @ fəˈnɛtɪk)
Jonathan Allan

Vấn đề tương tự cũng xảy ra trong ví dụ không hợp lệ thứ hai nhưng tôi đã không nhận thấy nó. Nó ít quan trọng hơn bởi vì dù sao màu sắc cũng bị rối tung
fnɛtɪk

(một1,một2,một3,một4)một1số 8!một237một312!/2một4211

1
@Shaggy Có, một chuỗi dòng duy nhất là ổn
caird coinheringaahing

Câu trả lời:


13

Than , 334 297 byte

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'→↑Þ³№¹”²δ≔θζ≔ηε

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập số nguyên vào biến q.

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

Chia qcho 3⁷, đặt phần còn lại vào e. Sau đó, xem xét enhư một số trong cơ sở 3, hậu tố một chữ số để ecác chữ số của nó (trong cơ sở 3) cộng với bội số của 3. Điều này cho phép exác định các góc quay của các góc.

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

Chia qcho 8!, Đặt phần còn lại vào z. (8! Được lưu tạm thời dđể lưu một byte.) Điều này cho phép zxác định vị trí của các góc.

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

Chia qcho 2¹¹, đặt phần còn lại vào h. Sau đó, xem xét hnhư một số trong cơ sở 2, thêm một chữ số để hcác chữ số của nó (trong cơ sở 2) cộng với bội số của 2. Điều này cho phép hxác định các lần lật của các cạnh.

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

Vòng qua một đại diện chuỗi của các trung tâm.

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

Nhảy đến vị trí của mỗi trung tâm và in nó.

≔⁰ω

Theo dõi sự tương đương của các vị trí góc trong biến w.

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

Tạo một mảng các vị trí góc.

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

Tạo một mảng các màu góc.

F²«

Lặp lại hai lần, một lần cho các góc, một lần cho các cạnh, sau đây được gọi là "khối".

Fδ«

Vòng qua mảng màu khối.

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

Trích xuất vị trí khối tiếp theo từ z, cập nhật tính chẵn lẻ trong w. Sử dụng chẵn lẻ này cho cuối cùng nhưng một cạnh. Điều này đảm bảo rằng tổng số chẵn lẻ của các cạnh và góc là chẵn.

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

In khối lập phương ở vị trí đó, điều chỉnh cho lần xoay tiếp theo hoặc lật cho phù hợp.

≧÷Lκε»

Hủy bỏ xoay hoặc lật từ e.

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

Tạo một mảng các vị trí cạnh. Điều này sẽ được sử dụng lần thứ hai thông qua các vòng lặp.

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

Tạo một mảng các màu cạnh.

≔θζ≔ηε

Ghi đè lên các biến góc zevới các biến cạnh tương ứng qhsao cho các cạnh được hoán vị và lật trong lần chuyển thứ hai của vòng lặp.


Hãy tự khuyên mình: Nếu một cái gì đó được chơi trong Char than là 330 byte, đừng thử nó trong PHP!
Đêm 2

@ Night2 Đáng buồn bây giờ 334, do một lỗi (tính toán chẵn lẻ không chính xác).
Neil

8

Ruby , 570 408 byte

->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}

Hãy thử trực tuyến!

Phiên bản gốc, với các dãy số ma thuật thay vì chuỗi ma thuật

->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}

Hãy thử trực tuyến!

Một hàm ẩn danh ở dạng hiện tại của nó có một đầu vào gồm hai số nguyên, dường như được cho phép: "bạn có thể chọn một phương thức nhập thay thế." Đầu tiên là hoán vị trong phạm vi 0 đến 12!*8!/2 - 1và thứ hai là hướng của các mảnh trong phạm vi 0 đến 2**11 * 3*7 - 1. Đầu ra ở trạng thái đã giải là chuỗi sau:

000
000
000
222333444555
222333444555
222333444555
111
111
111

Chơi gôn thêm

Có khoảng 10 ký tự nữa sẽ được lưu bằng cách điều chỉnh định dạng đầu ra thành hình dạng sau. Nhưng điều này sẽ làm giảm khả năng đọc, vì vậy hiện tại tôi sẽ không làm điều đó

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

Giải trình

Hoán vị

Trong nội bộ, trạng thái giải được thể hiện bằng chuỗi các số bát phân trong mảng a. Đầu vào gđược chia cho các số 12..1với mô-đun được sử dụng để chọn và loại bỏ một cạnh từ avà đặt nó vào z. Một khi điều này được thực hiện, chỉ các góc còn lại a, do đó gđược chia cho các số 8..1với mô đun được sử dụng để loại bỏ một góc từ avà đặt nó vào z.

Vì không đủ thông tin để xác định thứ tự của hai góc cuối cùng, giá trị của gsẽ được chia thành 0 cho đến khi chúng đạt đến chúng, vì vậy chúng sẽ luôn được thêm vào ztheo thứ tự ban đầu. Sau đó, một kiểm tra được thực hiện để xác định xem hoán vị tổng thể là chẵn hay lẻ, và nếu cần, hai góc cuối cùng được hoán đổi để làm cho hoán vị chẵn.

Sự định hướng

Có nhiều cách khác nhau để quyết định xem một góc hoặc cạnh có đúng hướng hay không nếu nó không ở vị trí đã giải quyết. Đối với mục đích của câu trả lời này, một góc được xem xét theo hướng chính xác của nó nếu nó hiển thị 0hoặc 1ở mặt trên hoặc mặt dưới. Do đó, xoay mặt trên hoặc mặt dưới không thay đổi hướng góc. Xoay các mặt khác sẽ thay đổi hướng, nhưng theo cách mà tổng số chẵn lẻ vẫn không thay đổi. Các cạnh được xem xét theo hướng chính xác nếu chúng hiển thị a 2hoặc 4phía trước / sau hoặc a 3hoặc 5sang trái / phải. Điều này có nghĩa là xoay vòng trên cùng hoặc dưới một phần tư lần lượt lật bốn cạnh nhưng xoay của các mặt khác khiến trạng thái lật không thay đổi.

Đầu vào chứa thông tin rõ ràng cho tất cả trừ cạnh đầu tiên và góc cuối cùng. 11 bit có ý nghĩa nhỏ nhất h%2048được tính tổng và mô đun được sử dụng để xác định hướng của cạnh đầu tiên. hđược nhân với 2 bằng cách thêm nó vào chính nó và giá trị cho hướng của cạnh đầu tiên được thêm vào dưới dạng bit có trọng số thấp nhất. Hướng của góc cuối cùng được tìm thấy bằng cách trừ dần dần hướng của các góc khác từ j. Đối với góc cuối cùng (trong đó i/19= 1), giá trị của j%3được thêm vào h(sẽ giảm xuống 0) và điều này xác định hướng của góc cuối cùng.

Chuỗi bđược khởi tạo trước với văn bản cho các trung tâm của khuôn mặt. hđược chia cho 2mười hai lần sau đó 3tám lần, với mô đun được sử dụng để xác định hướng của các mảnh. Trong mỗi trường hợp, số trong zđược chuyển đổi thành một chuỗi có số chữ số thích hợp (2 hoặc 3) và sau đó chuỗi được nhân đôi. Điều này cho phép xoay chính xác các chữ số mà modulo tìm thấy được trích xuất từ ​​chuỗi bằng cách lập chỉ mục và gắn vàob

Trưng bày

Cuối cùng, các nhãn dán thô được sao chép từ bmột định dạng dễ đọc hơn sbằng cách sử dụng các số ma thuật trong bảng chỉ mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.