Nó có phải là khối Rubik không?


25

Một thời gian trôi qua đáng kính của trẻ em là để chỉ ra rằng hình ảnh của "Rubik's Cubes" (trên áo phông, áp phích, vv) không thực sự có thể giải được.

Điều đầu tiên cần kiểm tra là khối lập phương được tạo thành từ các mảnh bên phải. Để có thể giải được một khối lập phương cần sáu màu với chín ô vuông. Khối lập phương cũng cần mỗi đơn vị cạnh và góc (đây là những khối nhỏ hơn tạo nên khối) là duy nhất. Chúng không chỉ phải là duy nhất mà nếu hai mảnh trung tâm đối diện nhau thì không có mảnh cạnh hay góc nào có thể chứa cả hai màu đó.

Một khi bạn có một khối lập phương được tạo thành từ tất cả các mảnh phù hợp, bạn vẫn cần xác minh nó có thể giải được. Có một vài quy tắc ở đây, vì vậy tôi sẽ nói với một chuyên gia để giải thích chúng, spoiler bên dưới giải thích cách chúng ta có thể làm điều này. Nếu bạn muốn tự mình giải quyết vấn đề, bạn không cần phải truy cập trang web để hiểu hoặc tham gia vào thử thách này.

Liên kết giải thích

Nhiệm vụ của bạn là lấy một mẫu làm đầu vào và xác định xem trên thực tế nó có phải là khối Rubik có thể giải được hay không. Để có thể giải quyết được, phải có một cách để thực hiện các bước di chuyển hợp lệ trên một khối để khối lập phương chỉ có một màu trên mỗi mặt (và các mặt khác nhau có màu khác nhau). Hầu hết các hình khối của Rubik đều có màu chuẩn (Màu trắng đối diện với màu Vàng, v.v.) bạn không thể cho rằng trạng thái giải quyết tuân theo màu đặc biệt này.

Di chuyển hợp lệ là xoay theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ của một mặt của khối lập phương. Với sự xoay của khuôn mặt của khối lập phương, bất kỳ hình vuông nào giáp với khuôn mặt cũng được xoay theo, kết nối với khuôn mặt mà chúng đã chạm vào trước đó.

Tôi

Bạn có thể lấy khối lập phương theo bất kỳ cách hợp lý. Nếu ngôn ngữ của bạn có một số loại "khối lập phương" tích hợp, tốt cho bạn, điều đó cũng tốt như đầu vào, khôn ngoan khác, bạn có thể lấy một mảng 2D của mạng, của khối lập phương, 1 3 cho 3 danh sách cho mỗi mặt. Chỉ cần hợp lý. Nếu bạn muốn biết một định dạng cụ thể có thể chấp nhận được bình luận hay ping tôi trong trò chuyện và tôi sẽ thêm vào thử thách để nêu rõ tính hợp lệ của nó.

Định dạng đầu vào của bạn chỉ cần hỗ trợ tối đa 9 màu có thể.

Đối với đầu ra, đây là một vấn đề quyết định, do đó bạn nên xuất một giá trị không đổi cho "Có, đây là khối Rubik hợp lệ" và một giá trị không đổi khác nhau cho "Không, đây không phải là khối Rubik hợp lệ".


Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Các trường hợp thử nghiệm

Dưới đây là các trường hợp thử nghiệm. Chúng được định dạng là mạng của một khối lập phương với mỗi hình vuông là một chữ cái duy nhất. Các chữ cái khác nhau đại diện cho màu sắc khác nhau. Bất kỳ thêm testcase có thể được thêm vào theo yêu cầu.

Tan

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

Không thể giải quyết

   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
Tôi cảm thấy bắt buộc phải chỉ ra rằng khối Rubik trong hình đại diện của bạn không thể giải được. Nó chỉ có 4 hình vuông ở một bên đối diện với chúng tôi, trong khi một khối Rubik bình thường nên có 9. Không đề cập đến các biểu tượng kỳ lạ trên đầu các hình vuông.
DJMcMayhem

2
@DJMcMayhem Con tôi có khối Rubik chỉ với bốn "khối con".
Adám

2
@ H.PWiz Không, bạn không thể. Điều đó đã tiềm ẩn trong định nghĩa của tôi nhưng tôi sẽ làm cho nó rõ ràng trong câu hỏi.
Thuật sĩ lúa mì

2
Đặc điểm kỹ thuật của bạn không bao gồm một mô tả đầy đủ về ba luật tương đương của khối lập phương. 1. Không thể chỉ có 1 cạnh lật 180 độ (đã đề cập) 2. Không thể chỉ có 1 góc xoắn 120 độ (không được đề cập) 3. Không thể có hoán vị lẻ của các hình khối (không được đề cập. ). Tôi đang bỏ phiếu chặt chẽ cho đến khi điều này được giải quyết. Xem ryanheise.com/cube/cube_laws.html để được giải thích.
Cấp sông St

4
@LevelRiverSt Lưu ý rằng khối Rubik là khép kín, bất kỳ ai cũng có thể xuất phát từ các công thức toán học và luật chẵn lẻ một cách độc lập.
dùng202729

Câu trả lời:


14

Về cơ bản , 1664 1631 1089 byte

⇒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

Đầu ra nếu có thể giải quyết: Solved!
Đầu ra nếu không thể giải quyết: (trống, không có đầu ra)

Đầu vào phải được định dạng dưới dạng khối lập phương khối (xem Debugphần). Điều này đã được OP cho phép rõ ràng.

Giải trình

Chương trình này sử dụng phương pháp sử dụng Thuật toán của quỷ để lặp lại mọi trạng thái có thể có của khối trong cùng một nhóm với khối được giải. Nếu khối lập phương có thể giải được, nó sẽ được giải quyết tại một số điểm trước khi thuật toán kết thúc (giả sử thuật toán tôi sử dụng hoạt động đúng).

Mỗi dòng bắt đầu bằng (0x84 trong bảng mã của Cubally) là một định nghĩa hàm; các hàm này xây dựng lẫn nhau để tạo nên Thuật toán Quỷ dữ thực sự. Dòng đầu tiên được thực hiện là dòng cuối cùng:

rs[f36f71]8

rđọc một khối từ stdin và đặt khối bộ nhớ cho nó. sđặt trình thông dịch vào "solvemode", có nghĩa là nó thoát ra và in Solved!nếu khối được giải quyết (sau khi không được giải quyết) tại bất kỳ điểm nào. Phần còn lại của các lệnh (chỉ đơn giản lặp lại f36f718 lần) tương ứng với thuật toán cuối cùng ở cuối trang được liên kết:

(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.

Làm thế nào tôi có thể chạy nó?

Bạn có thể thử trực tuyến , nhưng liên kết đó không hoạt động. TIO gần như chắc chắn sẽ hết thời gian trước khi thuật toán này kết thúc (thời gian chạy tối đa cho trình thông dịch là 60 giây). Nếu khối không thể giải được, thuật toán này sẽ mất tới 11 triệu năm để hoàn thành về mặt thực tế (ở mức 15,2 triệu di chuyển mỗi giây, đó là điều mà Cloud9 IDE của tôi có được).

Ngoài ra, bạn cần rất nhiều bộ nhớ để thực hiện 3 bước di chuyển. Về cơ bản có thể thực hiện khoảng 4 triệu di chuyển mỗi giây, nhưng quá trình này rất có thể sẽ bị giết do bộ nhớ quá mức . Nó chết sau 15 giây trên máy ảo của tôi với bộ nhớ 512MB. Tại sao nên thực hiện di chuyển trên bộ nhớ chi phí mảng phẳng đã được phân bổ? Tìm thấy một rò rỉ bộ nhớ (hoặc hai mươi) và sửa nó .

Đây là một phiên bản dễ đọc hơn nhiều, hoạt động theo cùng một cách.

Nhưng tôi thực sự muốn thấy rằng nó hoạt động!

Bước đi thực tế đầu tiên được thực hiện trong thuật toán của ác quỷ này là F2, vì vậy khối lập phương nhanh nhất để giải quyết sẽ là một cuộc tranh giành với F2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

Điều này thực sự thực hiện trong 0,007 giây trên TIO .

Làm thế nào điều này có thể được cải thiện?

Chắc chắn có nhiều thuật toán của quỷ hơn; Tôi đã tìm thấy một trong số đó sử dụng ít hơn một phần ba trong số các động tác này. Tuy nhiên, điều đó sẽ có chi phí vài nghìn byte (khoảng 100 MB nữa) và vài chục giờ chuyển đổi một mạch Hamilton phức tạp thành mã Lập phương.

Cũng có thể loại bỏ một số chức năng và đặt chúng thẳng vào vòng lặp ở phía dưới. Tuy nhiên, tôi sẽ hy sinh một số byte để có thể đọc được.

Ngoài ra, tôi đang xem xét sửa đổi hành vi lặp của Cubally để tôi có thể dễ dàng lặp lại thuật toán 7 hoặc 8 lần hơn (thay vì chỉ mã hóa chúng bằng các lệnh gọi lặp lại 7 hoặc 8 lần trong nguồn). Hoặc tôi sẽ thực hiện một số phép thuật với notepad và chơi golf bằng cách sử dụng nhiều vòng lặp hơn.

Lưu ý rằng tôi sẽ tiếp tục tối ưu hóa mọi thứ có thể có trong trình thông dịch, vì vậy điều này có thể hoạt động trên một PC trung bình đôi khi trong tương lai!


Về cơ bản, 2 byte

r▦

Tôi thích câu trả lời trên tốt hơn vì vậy tôi thêm nó dưới dạng một giải pháp thay thế. Điều này diễn ra trong một giây, trái ngược với một vài triệu năm.

r    read cube from standard in
 ▦   and solve it

Đầu ra nếu khối có thể giải được: (không có gì)
Đầu ra nếu khối không thể giải được: Error: The cube has reached an unsolvable state.


Điều này có hoạt động nếu chúng ta trao đổi bên? Ví dụ 2 đối diện 4 trong bãi chứa khối, nó có hoạt động không nếu 2 đối diện 5 và 4 đối diện 0?
Thuật sĩ lúa mì

1
@WheatWizard Đúng vậy, solvemode kiểm tra xem mỗi mặt có một số nguyên duy nhất không và nếu số nguyên đó là số duy nhất trên mặt.
MD XF

Ok như nó phải. Tôi không quen thuộc với Cub đủ để biết liệu đây có phải là trường hợp hay không từ mô tả của bạn.
Phù thủy lúa mì

@WheatWizard Chỉ cần chắc chắn rằng tôi hiểu bạn chính xác - đây là (dọc theo dòng) những gì bạn đã đề cập đến, phải không?
MD XF

Vâng. Và nó nên được giải quyết.
Phù thủy lúa mì

4

APL (Dyalog Classic) , 190 174 byte

{∧/~∊(×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∘⌷¨⍵)}

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

Đối số là ma trận 3x2 (row0: front back, row1: left right, row2: up down) của các ma trận 3x3 ký tự. Trả về 1 cho khối Rubik có thể giải được, 0 nếu không.

Trong liên kết TIO, hàm t, không bao gồm trong số ký tự, đọc 9 dòng đầu vào, chuyển đổi chúng từ định dạng đầu vào mặc định (mạng) sang ma trận 3x2 x 3x3 cần thiết, gọi giải pháp và in OK nếu kết quả đúng như mong đợi

Thuật toán chia khối lập phương đã cho thành 26 khối - chuỗi có độ dài 3 (góc), 2 (cạnh) và 1 (tâm). Nó cũng tạo ra 26 khối lập phương được giải với 6 khối trung tâm giống nhau. Tất cả các tiêu chí sau phải được đáp ứng:

  • không có sự trùng lặp giữa 6 trung tâm

  • các tập hợp các khối đã cho / đã giải khớp khớp, cho đến khi xoay - ví dụ: xem xét 'WBR''BRW'cùng một khối, nhưng không'BWR'

  • chẵn lẻ của cả hoán vị góc và hoán vị cạnh đều chẵn

  • các modulo-3 tổng của chỉ số xoay góc (ví dụ như lấy "nhỏ nhất" lá thư Bnhư một điểm tham chiếu ta có: 'BRW'→0, 'WBR'→1, 'RWB'→2) trận đấu giữa hình khối nhất định và giải quyết; tương tự cho các góc modulo 2

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.