Urutan bergerak adalah urutan gerakan (bergantian) pada Rubik's Cube (untuk notasi lihat di bawah). Di samping urutan langkah kosong, ada banyak urutan langkah lainnya, yang tidak memiliki efek pada kubus sama sekali. Kami menyebutnya urutan identitas urutan ini.
Beberapa urutan identitas ini jelas untuk ditentukan, disukai U2 R R' U2
atau U D2 U' D2
. Dalam yang pertama, dua gerakan acak dilakukan U2 R
dan setelah itu segera dibatalkan R' U2
. Yang kedua mirip. Dua gerakan acak pertama U D2
dan setelah itu dibatalkan, tetapi dalam urutan terbalik U' D2
. Ini hanya berfungsi, karena bergerak U
hanya mempengaruhi potongan-potongan lapisan atas dan bergerak D2
hanya efek potongan-potongan lapisan bawah. Anda dapat melihat visualisasi dari dua urutan langkah ini.
Urutan identitas lainnya mungkin tidak jelas sama sekali. Misalnya urutannya R' U' R' F' U F U' R' F R F' U' R U2 R
. Cukup panjang, tetapi juga tidak memiliki efek sama sekali pada kubus.
Pindahkan Notasi
Sebuah langkah menggambarkan pergantian satu lapisan dari satu dari enam permukaan kubus. Pindah terdiri dari satu huruf yang mewakili wajah diikuti oleh akhiran opsional yang mewakili sudut belokan.
Huruf dan wajahnya yang sesuai adalah U (Atas - sisi menghadap ke atas), D (Bawah - sisi menghadap ke bawah), R (Kanan - sisi menghadap ke kanan), L (Kiri - sisi menghadap ke kiri) , F (Depan - sisi menghadap Anda) dan B (Belakang - sisi menghadap jauh dari Anda).
Jika tidak ada sufiks, wajah diputar 90 derajat searah jarum jam, sufiks '
berarti, wajah berubah 90 derajat berlawanan arah jarum jam, dan sufiks 2
berarti, wajah diputar 180 derajat searah jarum jam.
Jika Anda memiliki masalah dengan notasi, cukup gunakan http://alg.cubing.net , di mana Anda dapat memvisualisasikan urutan langkah tersebut.
Tantangan
Tugas Anda adalah menulis sebuah program, yang menentukan apakah urutan langkah adalah identitas atau bukan.
Anda dapat menulis program atau fungsi lengkap. Ini harus menerima string yang berisi urutan bergerak (bergerak terpisah oleh spasi) sebagai input (melalui STDIN, argumen baris perintah, argumen cepat atau fungsi), dan output (melalui nilai balik atau STDOUT) nilai Boolean atau bilangan bulat yang sesuai ( Benar - 1 - urutan identitas / Salah - 0 - bukan urutan identitas).
Jika akhiran Anda '
menciptakan masalah dalam bahasa pemrograman Anda, Anda dapat menggunakan simbol yang berbeda, tetapi tidak pada digit. R F2 U3
tidak diizinkan.
Ini codegolf, karena itu kode terpendek (dalam byte) menang.
Uji Kasus
"" -> 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
sumber
R F2 U3
?U3
, maka Anda bisa memasukkan sufiks ke angka.R2 D2
.That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Jawaban:
Haskell,
263261247243 karakterAlgoritma agak lurus; setiap cubelet terbuat dari 1,2,4 atau 8 chunk yang menyandikan posisi dan orientasinya; 4 potongan per cubelet tepi, 8 per cubelet sudut, 7 cubelet stasioner.
c
c homps setiap kata dari input ke dalam urutan putaran CW, dan!
mengirimkan setiap potongan sesuai dengan putaran.i
adalah posisi i dentity.f
adalah f unction utama .Saya tidak terlalu senang dengan
c
fungsi homp, tapi sepertinya saya juga tidak bisa menemukan cara untuk mempersingkatnya (@Nimi melakukannya)sumber
c(x:"2")=[x,x]
danc(x:_)=[x,x,x]
. Menghemat 2 byte.i=sequence[s,s,s]
, dan ubah semua tupel menjadi daftar (yaitu:(x,y,z)
menjadi[x,y,z]
) - ini akan menghemat ~ 9 karakter. Memasukkannya menghemat 4 lebih banyak. Menjatuhkan_
!
i
, terima kasih. Tidak yakin apa yang Anda maksud dengan sebarisi
- harap perhatikan itu muncul dua kali dalam definisi untukf
. Tidak yakin apa yang Anda maksud dengan menjatuhkan_
kasing - meninggalkan_->a
atau memindahkannya ke atas menghasilkan pengecualian pola yang tidak lengkap, dan memindahkannya ke atas tidak menyimpan karakter apa pun. Saya berhasil menyimpan 5 karakter di sana.Secara kubik ,
64 byteSaya menang: P
Notepad diinisialisasi ke nol. "Wajah" ke-8 berisi 1 jika kubus tidak terpecahkan dan 0 sebaliknya.
Cobalah online!
sumber
J -
232, 220, 381, 315296 byteSolusi ini mengkodekan semua operasi sebagai permutasi wajah dan bekerja berdasarkan fakta bahwa semua lilitan wajah sebenarnya sama, di bawah rotasi seluruh kubus.
Sunting : beberapa lagi bermain golf
Selain percobaan sebelumnya, ini memang memperhitungkan rotasi sudut.
f
hanyalah fungsi pembantu.r
Apakah rotasi satu wajah. wajah dikodekan sebagai berikut:urutan ini memfasilitasi pengkodean rotasi dan putaran.
t
adalah kata keterangan yang memutar wajah di bawah rotasi kubus tertentu, memilih wajah.X
danY
keterangan yang mengambil sebagai argumen kiri jumlah ke arah seluruh kubus.Baris berikutnya mendefinisikan semua rotasi: 3 karakter per rotasi: nama, jumlah rotasi dan arah.
Baris terakhir mendefinisikan kata kerja tes
T
, mengkonversi 3 dan'
ke notasi Power, membalik urutan operasi menambahkan vektor tes dan akhirnya mengesampingkan semuanya.Lebih detail berdasarkan permintaan.
sumber
Python 3: 280 karakter
Ini bukan peserta dalam tantangan. Pertama karena saya bertanya sendiri tantangan dan kedua karena itu bukan kode saya. Semua kredit adalah milik Stefan Pochmann , yang menemukan cara yang mengagumkan dalam mensimulasikan Rubik's Cube. Saya hanya melakukan beberapa golf dan beberapa perubahan kecil sehubungan dengan tantangan.
Gagasan di balik ini adalah sebagai berikut.
s
merupakan lokasi dari potongan-potonganUF
,UR
dan sebagainya. Misalnya:s = ['DF', 'BL', ...]
berarti, potonganUF
berada di posisiDF
, potonganUR
berada di posisiBL
, ...Bagaimana posisi sepotong berubah, ketika melakukan gerakan. Jika Anda melakukan
U
-move, semua stiker (warna) dariU
-layer, yang menghadap wajah depan, pindah ke wajah kiri. Stiker wajah kiri bergerak ke belakang, ini ke kanan dan ini ke wajah depan. Disandikan olehFLBR
. Beberapa contoh:UF
pindah keUL
,UFR
pindah keULF
dan sebagainya. Oleh karena itu, menerapkan langkah hanya menerjemahkan wajah potongan-potongan di lapisan yang sesuai.sumber