Apakah itu Kubus Rubik?

25

Waktu luang para pedant yang terhormat adalah untuk menunjukkan bahwa foto-foto "Rubik's Cubes" (pada kaos, poster, dll.) Sebenarnya tidak dapat dipecahkan.

Hal pertama yang harus diperiksa adalah kubus terdiri dari potongan yang tepat. Untuk dipecahkan kubus membutuhkan enam warna masing-masing dengan sembilan kotak. Kubus juga membutuhkan setiap unit tepi dan sudut (ini adalah kubus kecil yang membentuk kubus) untuk menjadi unik. Tidak hanya mereka harus unik tetapi jika dua bagian tengah saling berhadapan satu sama lain tidak ada bagian tepi atau sudut dapat mengandung kedua warna tersebut.

Setelah Anda memiliki kubus yang terdiri dari semua bagian yang tepat, Anda masih perlu memverifikasinya agar dapat dipecahkan. Ada beberapa aturan di sini, jadi saya akan meminta ahli untuk menjelaskannya, spoiler di bawah ini menjelaskan bagaimana kita bisa melakukan ini. Jika Anda tertarik untuk menyelesaikan masalah Anda sendiri, Anda tidak perlu mengunjungi situs untuk memahami atau berpartisipasi dalam tantangan ini.

Penjelasan terkait

Tugas Anda adalah mengambil pola sebagai input dan menentukan apakah itu sebenarnya kubus Rubik yang dapat dipecahkan. Untuk dipecahkan harus ada cara untuk melakukan gerakan yang valid pada kubus sehingga kubus hanya memiliki satu warna pada setiap wajah (dan wajah yang berbeda memiliki warna yang berbeda). Sebagian besar kubus Rubik memiliki pewarnaan standar (Putih berlawanan Kuning, dll.) Anda mungkin tidak menganggap bahwa kondisi penyelesaian mengikuti pewarnaan khusus ini.

Langkah yang valid adalah rotasi searah jarum jam atau berlawanan arah jarum jam dari satu permukaan kubus. Dengan rotasi muka kubus setiap kotak yang membatasi wajah diputar juga, tetap terhubung ke wajah yang sebelumnya mereka sentuh.

IO

Anda dapat mengambil kubus dengan cara yang masuk akal. Jika bahasa Anda memiliki beberapa tipe "kubus-wajah" bawaan, bagus untuk Anda, itu bagus sebagai input, jika tidak Anda dapat mengambil array 2D dari jaring, kubus, daftar 1 3 dengan 3 untuk setiap wajah. Masuk akal saja. Jika Anda ingin tahu apakah format tertentu dapat diterima komentar atau ping saya dalam obrolan dan saya akan menambah tantangan untuk menyatakan validitasnya.

Format input Anda hanya perlu mendukung hingga 9 warna yang memungkinkan.

Untuk output, ini adalah masalah keputusan sehingga Anda harus menampilkan satu nilai konstan untuk "Ya, ini adalah kubus Rubik yang valid" dan satu nilai konstanta berbeda untuk "Tidak, ini bukan kubus Rubiks yang valid".


Ini adalah sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte lebih baik.

Uji Kasus

Berikut ini adalah contoh-contoh uji. Mereka diformat sebagai jaring kubus dengan setiap kotak sebagai satu huruf. Huruf yang berbeda mewakili warna yang berbeda. Setiap testcases lagi dapat ditambahkan atas permintaan.

Larut

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

Tidak dapat diselesaikan

   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
Wisaya Gandum
sumber
14
Saya merasa berkewajiban untuk menunjukkan bahwa kubus Rubik di avatar Anda tidak dapat dipecahkan. Hanya memiliki 4 kotak di sisi yang menghadap kita, sedangkan kubus Rubik yang normal seharusnya memiliki 9. Belum lagi simbol aneh di atas kotak.
DJMcMayhem
2
@DJMcMayhem Anak-anak saya memiliki kubus Rubik dengan hanya empat "sub-kubus".
Adám
2
@ H.PWiz Tidak, kamu tidak bisa. Itu tersirat dalam definisi saya tetapi saya akan membuatnya eksplisit dalam pertanyaan.
Wheat Wizard
2
Spesifikasi Anda tidak termasuk deskripsi lengkap tentang tiga hukum paritas kubus. 1. Tidak mungkin memiliki hanya 1 sisi membalik 180 derajat (disebutkan) 2. Tidak mungkin hanya memiliki 1 sudut memutar 120 derajat (tidak disebutkan) 3. Tidak mungkin untuk memiliki permutasi aneh dari kubus (tidak disebutkan. ). Saya memberikan suara dekat sampai ini diselesaikan. Lihat ryanheise.com/cube/cube_laws.html untuk penjelasan.
Level River St
4
@LevelRiverSt Perhatikan bahwa kubus Rubik mandiri, siapa pun dapat diturunkan pada formulasi matematika dan hukum paritas secara independen.
user202729

Jawaban:

14

Secara kubik , 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

Output jika dipecahkan: Solved!
Output jika tidak dapat dipecahkan: (kosong, tidak ada output)

Input harus diformat sebagai kubus-dump Cubically (lihat Debugbagian). Ini secara eksplisit diizinkan oleh OP.

Penjelasan

Program ini mengambil pendekatan menggunakan Algoritma Iblis untuk beralih ke setiap keadaan yang mungkin dari kubus dalam kelompok yang sama dengan kubus yang diselesaikan. Jika kubus dipecahkan, itu akan diselesaikan di beberapa titik sebelum algoritma selesai (dengan asumsi algoritma yang saya gunakan berfungsi dengan baik).

Setiap baris yang diawali dengan (0x84 dalam codepage Cubically) adalah definisi fungsi; fungsi-fungsi ini membangun satu sama lain untuk membentuk Algoritma Iblis yang sebenarnya. Baris pertama yang dieksekusi adalah yang terakhir:

rs[f36f71]8

rmembaca sebuah kubus dari stdin dan mengatur kubus memori untuk itu. smenempatkan interpreter ke "solvemode", yang berarti ia keluar dan mencetak Solved!jika kubus dipecahkan (setelah tidak terpecahkan) di titik mana pun. Sisa dari perintah (yang hanya mengulang f36f718 kali) sesuai dengan algoritma terakhir di bagian bawah halaman yang ditautkan:

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

Bagaimana saya bisa menjalankannya?

Anda dapat mencobanya secara online , tetapi tautan itu tidak berfungsi. TIO hampir pasti akan kehabisan waktu sebelum algoritma ini selesai (runtime maksimum untuk seorang juru bahasa adalah 60 detik). Jika kubus tidak dapat dipecahkan, algoritme ini akan memakan waktu hingga 11 juta tahun untuk diselesaikan secara kubik (pada ~ 15,2 juta gerakan per detik, yang didapat dari IDE Cloud9 saya ).

Selain itu, Anda membutuhkan banyak memori untuk melakukan 3 sextillion move. Secara kubik dapat melakukan sekitar 4 juta gerakan per detik, tetapi prosesnya kemungkinan besar akan mati karena memori yang terlalu padat . Mati setelah 15 detik pada VM saya dengan memori 512MB. Mengapa melakukan perpindahan pada memori biaya flat array yang sudah dialokasikan? Menemukan kebocoran memori (atau dua puluh) dan memperbaikinya .

Berikut adalah versi yang jauh lebih mudah dibaca yang berperilaku dengan cara yang sama.

Tetapi saya benar-benar ingin melihat bahwa itu berhasil!

Langkah aktual pertama yang dieksekusi dalam algoritma iblis ini adalah F2, jadi kubus tercepat untuk dipecahkan adalah yang diacak dengan F2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

Ini memang dijalankan dalam 0,007 detik pada TIO .

Bagaimana ini bisa diperbaiki?

Tentu saja ada lebih banyak algoritma iblis; Saya telah menemukan yang menggunakan kurang dari tigapuluh dari langkah yang satu ini. Namun, itu akan memakan biaya beberapa ribu byte (sekitar 100MB lebih) dan beberapa lusin jam mengubah sirkuit Hamiltonian yang kompleks menjadi kode Cubically.

Dimungkinkan juga untuk menghapus beberapa fungsi dan meluruskannya di loop di bagian bawah. Namun, saya akan mengorbankan beberapa byte untuk dibaca.

Selain itu, saya sedang mempertimbangkan modifikasi perilaku looping Cubically sehingga saya dapat lebih mudah mengulangi algoritma 7 atau 8 kali (daripada hanya mengkodekan mereka dengan panggilan fungsi yang diulang 7 atau 8 kali dalam sumber). Atau saya akan mengerjakan beberapa keajaiban dengan notepad, dan bermain golf ini menggunakan lebih banyak loop.

Perhatikan bahwa saya akan terus mengoptimalkan apa pun yang mungkin dalam juru bahasa, jadi ini mungkin bekerja pada PC biasa di masa depan!


Secara kubik, 2 byte

r▦

Saya suka jawaban di atas lebih baik jadi saya menambahkan ini sebagai solusi alternatif. Ini berjalan di bawah satu detik, dibandingkan dengan beberapa juta tahun.

r    read cube from standard in
 ▦   and solve it

Output jika kubus dipecahkan: (tidak ada)
Output jika kubus tidak dapat dipecahkan: Error: The cube has reached an unsolvable state.

MD XF
sumber
Apakah ini berfungsi jika kita bertukar sisi? Misalnya 2 adalah kebalikan 4 di dalam kubus dump, apakah itu bekerja jika 2 berlawanan 5 dan 4 berlawanan 0?
Wheat Wizard
1
@WheatWizard Ya, solvemode memeriksa apakah setiap wajah memiliki bilangan bulat yang unik, dan jika bilangan bulat itu adalah satu-satunya wajah.
MD XF
Ok seperti seharusnya. Saya tidak terbiasa dengan Cubically cukup untuk mengetahui apakah ini yang terjadi atau tidak dari deskripsi Anda.
Wheat Wizard
@WheatWizard Hanya memastikan saya mengerti Anda dengan benar - ini (sepanjang baris) apa yang Anda maksudkan, apakah itu benar?
MD XF
Iya nih. Dan itu harus dipecahkan.
Wheat Wizard
4

APL (Dyalog Classic) , 190 174 bytes

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

Cobalah online!

Argumennya adalah matriks 3x2 (row0: depan belakang, row1: kiri kanan, row2: atas ke bawah) dari matriks karakter 3x3. Mengembalikan 1 untuk kubus Rubik yang dapat dipecahkan, 0 sebaliknya.

Dalam tautan TIO, fungsi t, yang tidak termasuk dalam jumlah karakter, membaca 9 baris input, mengubahnya dari format input default (jaring) ke matriks 3x2 x 3x3 yang diperlukan, memanggil solusi dan mencetak OK jika hasilnya seperti yang diharapkan.

Algoritma membagi kubus yang diberikan menjadi 26 cubies - string dengan panjang 3 (sudut), 2 (tepi), dan 1 (tengah). Ini juga menghasilkan 26 kubus kubus diselesaikan dengan 6 kubus pusat yang sama. Semua kriteria berikut harus dipenuhi:

  • tidak ada duplikat di antara 6 pusat

  • set kubus yang diberikan / diselesaikan cocok, hingga rotasi - mis. pertimbangkan 'WBR'dan 'BRW'kubie yang sama, tetapi tidak'BWR'

  • paritas dari permutasi sudut dan permutasi tepi adalah genap

  • Modulo-3 jumlah indeks rotasi sudut (misalnya mengambil "terkecil" surat Bsebagai titik acuan kita memiliki: 'BRW'→0, 'WBR'→1, 'RWB'→2) pertandingan antara kubus yang diberikan dan diselesaikan; sama untuk sudut-sudut modulo 2

ngn
sumber