Kubus Rubik memiliki 6 warna: merah, oranye, kuning, putih, biru, dan hijau. Wajah merah dan oranye, kuning dan putih, dan biru dan hijau berada di sisi yang berlawanan.
Jaring kubus Rubik yang sudah selesai terlihat seperti ini:
Y
BRGO
W
Dan ubinnya terlihat seperti ini:
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Tantangan
Rotasi yang diberikan, rotasi terbalik, atau rotasi ganda menghasilkan apa yang akan diubah oleh kubus yang dipecahkan, seperti ASCII atau sebagai gambar (spasi putih tidak diperlukan, mungkin atau mungkin tidak ada, spasi spasi tambahan diperbolehkan.).
Input akan berupa rotasi (dan pengubah opsional). Notasi rotasi berjalan seperti: U
(p), L
(eft), F
(ront), R
(ight), B
(ack), D
(own); 2
(ganda), '
atau i
(terbalik).
Semua rotasi normal akan 90 ° searah jarum jam, yang terbalik akan berlawanan arah jarum jam.
Penjelasan tentang jarum jam : Bayangkan kubus saat Anda melihat wajah merah, dan wajah kuning di atas. Kemudian putar kubus sehingga wajah yang akan diputar program akan menghadap Anda. Inilah cara kerja jarum jam akan bekerja. (Kecuali wajah belakang, Anda akan memutar kubus secara horizontal dalam kasus itu.)
Memasukkan
Input akan menjadi daftar langkah.
Keluaran
Seni ASCII yang mewakili kubus atau gambar dari jaring kubus.
Contohnya
Input : (kosong)
Keluaran :
Y Y Y
Y Y Y
Y Y Y
B B B R R R G G G O O O
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Input : U
(atas)
Keluaran :
Y Y Y
Y Y Y
Y Y Y
R R R G G G O O O B B B
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Input : U'
atau Ui
(terbalik)
Keluaran :
Y Y Y
Y Y Y
Y Y Y
O O O B B B R R R G G G
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Input : U2
(dua kali lipat)
Keluaran :
Y Y Y
Y Y Y
Y Y Y
G G G O O O B B B R R R
B B B R R R G G G O O O
B B B R R R G G G O O O
W W W
W W W
W W W
Input : L'
(terbalik terbalik)
Keluaran :
R Y Y
R Y Y
R Y Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
B B B W R R G G G O O Y
O W W
O W W
O W W
Input : R
(kanan)
Keluaran :
Y Y R
Y Y R
Y Y R
B B B R R W G G G Y O O
B B B R R W G G G Y O O
B B B R R W G G G Y O O
W W O
W W O
W W O
Input : U2 L' D
(dua kali lipat, terbalik kiri, bawah)
Keluaran :
O Y Y
R Y Y
R Y Y
G B B W O O B B B R R Y
G B B W R R G G G O O Y
O O Y G B B W R R G G G
R O O
W W W
W W W
Aturan
- Tidak ada celah yang diizinkan.
- Ini adalah kode-golf , jadi kode terpendek dalam byte yang menyelesaikan masalah akan menang.
S
,E
,M
,x
,y
,z
,u
/Uw
,d
/Dw
,r
/Rw
,l
/Lw
,f
/Fw
,b
/Bw
bergerak juga? Atau hanya default:U
,D
,R
,L
,F
,B
dan varian berlawanan dengan tanda kutip ('
)? Di luar topik: Saya selalu bertanya-tanya dengan pertanyaan terkait Kubus Rubik, apakah Anda juga seorang kolektor Twisty Puzzles?Jawaban:
Ruby,
370 339305 byteSuntingan terakhir: beberapa byte disimpan oleh penataan ulang rumus plotting dan penghapusan tanda kurung yang tidak perlu. Penghematan besar dengan menulis ulang generasi kubus - Saya tidak pernah tahu Ruby memiliki builtin untuk Produk Cartesian!
Fungsi anonim.
Menerima larik string, masing-masing mewakili satu putaran wajah (string tunggal dengan spasi di antara setiap putaran wajah adalah 6 byte tambahan.)
Mengembalikan string persegi panjang 9x12.
Penjelasan singkat
Ini didasarkan pada konsep dari jawaban saya untuk pertanyaan ini , yang pada gilirannya didasarkan pada konsep serupa oleh Jan Dvorak.
Baris pertama menghasilkan array elemen 27, mewakili 27 cubies. Setiap kubie diwakili oleh vektor 3 dimensi di mana tanda mewakili posisi saat ini dan besarnya setiap koordinat mewakili kode ascii untuk warna stiker.
Contoh pindah: untuk R, untuk setiap cubie periksa apakah koordinat x adalah> 0 dan jika demikian putar 90 derajat dengan menukar koordinat y dan z dan menukar tanda salah satunya.
Ambil array ruang 9x12 dan plot kubus ke dalamnya. Untuk setiap cubie dan sumbu, kami memeriksa apakah stiker itu ada (berkoordinasi dalam sumbu itu nol), dan mencari tahu ke mana harus pergi. Kemudian kami mengambil koordinat dan melakukan
.abs.chr
untuk mengubah nomor menjadi karakter yang diperlukan dan merencanakannya.Tidak diuji dalam program uji (per 339 byte edit)
Keluaran
sumber
Javascript (ES5), 1615 byte
Tidak Disatukan:
Ini adalah tantangan yang sangat sulit.
Penjelasan
Ambil contoh panggilan
s("R U' F")
.Program hanya dapat menjalankan gerakan x, y dan R.
U'
sama denganU U U
, jadi gantikan itu.F
sama dengany y y R y
, jadi gantikan itu.R U' F'
Oleh karena itu sama denganR U U U y y y R y
, yang dapat dijalankan oleh program.cstate didefinisikan dengan kubus yang diselesaikan. Sebuah kubus diwakili oleh sebuah array yang berisi 6 array yang berisi 9 stiker. Array pertama adalah untuk R, kedua untuk U, ketiga untuk F, D, B, array terakhir adalah untuk L. Ketika suatu y perlu dieksekusi, program menukar empat larik depan, kiri, belakang dan wajah kanan. Untuk x, ia berganti depan, bawah, belakang dan atas. Setiap rotasi juga memutar wajah-wajah lain, yang tidak ditukar. Gerakan AR memutar wajah kanan dan menukar bagian kanan depan, atas, belakang, bawah.
Ini dapat dimodifikasi untuk dapat menyelesaikan masalah dengan semua jenis gerakan, dengan mendefinisikannya dengan x, y dan R.
sumber
R U' F2
dikonversi menjadiR U' F F
pertama, laluR U U U F F
, laluR x y R y y y x x x x y R y y y x x x x y R y y y x x x y y y R y y y y R y
yang dieksekusi? Aneh .. tapi sangat orisinal. +1 :) Bagaimana Anda mendapatkan ide ini?U'
menjadiU U U
, tetapix
es dany
s sangat bagus. Saya ingin mencuri ini juga: p'
dan2
, dan kemudian menggantikan semua gerakan.C,
17151709168613361328 byte25 byte disimpan berkat @KevinCruijssen!
Tidak ada jawaban sejauh ini, jadi saya memutuskan untuk memberikan solusi sendiri.
Cobalah online!
Versi lama yang tidak digabungkan:
sumber
for(b=1;b<8;b++)for(a=1;a<11;a++)r[b][a]=c[b];
kefor(b=1;b<8;)for(a=1;a<11;)r[b][a++]=c[b++];
danfor(i=1;i<=9;i++)
kefor(i=0;++i<=9;)
, dan beberapa lainnya untuk loop juga. Juga,else if
dapat diubah menjadi hanyaif
ketika Anda memeriksaif(d==66)B(r);if(d==76)L(r);...
Dan, kecualii
bisa negatif, Anda dapat berubahif(i%3==0)
menjadiif(i%3<1)
dua kali. Dan saya yakin itu bisa bermain golf lagi. Senang melihat jawaban atas tantangan Anda sendiri. :)if
s dani
meskipun, aku akan mengeditnya begitu aku pulang. Terima kasih!else
s bork program, bermain golf loop bork program, masalahnya dengani
bekerja. Bagaimanapun, terima kasih.else if
perubahanif
gagal? : S Di masing-masing yangelse if
Anda bandingkand==##
, jadi saya bingung mengapa tidak. Sekali lagi, saya tidak memprogram C, jadi mungkin saya kehilangan sesuatu yang jelas tidak bisa dilakukan C, tapi tetap saja ... Ah, senang saya bisa membantu dengan modulo<1
bukan==0
Python 3,
610 563 533526 byte-7 byte berkat rhsmits kolega saya (
d,*c
bentuk yang sangat bagus & penghapusan kurung yang berlebihan)Ini adalah program lengkap.
Superflip dan semua tes tersedia di ideone atau Coba online!
Program:
YBRGOW
stiker.r
yang hanya memutar stiker pada wajah, searah jarum jam seperempat putaranU
yang memutarU
wajah searah jarum jam seperempat putaran dengan menerapkanr
dan memutar stiker pada pita atasLFRB
searah jarum jam putaran seperempat putarany
yang bekerjar
padaU
danD
wajah dan irisanLFRB
- ini melakukan rotasi seluruh kubus dalam
y
sumbu (yang berjalan melaluiU
danD
)- rotasi searah jarum jam jika melihat dari atas
z
, yang melakukan rotasi seluruh kubus dalamz
sumbu searah jarum jam seperempat putaran melihatR
(sumbu berjalan melaluiR
danL
) - kali ini karena cara wajah berorientasi pada jaring kami (sama seperti yang diberikan dalam OP) kami harus membalikB
danU
menghadap (mereka beralih dari bagian horisontal ke vertikal jaring dan sebaliknya)input()
(gerakan yang akan dilakukan) mencocokkan karakter dariBUDLRF
(sebenarnyaB-U
) mungkin diikuti oleh karakter'i2
'i2
ke jumlah putaran searah jarum jam (tata6
cara mod ini melakukan pekerjaan, dengan bonekaa
untuk menghasilkan1
ketika tidak ada hadir)y
danz
, seperempat putaranU
(yang sekarang akan menjadi wajah yang diperintahkan), dan kemudian panggilan untuk membalik urutan pengaturan yang dilakukan. Mengambil ordinal dari modulo karakter wajah11
saat itu dengan7
petaB:0 U:1 D:2 L:3 F:4 R:5
, memungkinkan pengindeksan sederhana ke string dari urutan nama fungsi dibagi dengan spasi.d
untuk mempersingkat pencetakanU
danD
Inilah superflip :
sumber
Python
760750649 Bytestanpa malu-malu mencuri ide menggunakan hanya 3 rotasi dari @ Paul Schmitz: D
versi baru:
Saya kebanyakan hanya melakukan banyak slicing daftar numpy dan menggunakan fungsi rotate and roll bawaannya. Input ditangani dengan memanggil fungsi secara langsung
eval()
ungolfed ..
input tes:
Komentar atau saran sangat dihargai :)
sumber
of using only 3 rotations
salah. Program mengubah urutan apa pun menjadi urutan dengan lebih banyak gerakan. Jika Anda inputF F F F
, ia menggunakan lebih dari 3 rotasi, saat dikonversi key y y R y y y y R y y y y R y y y y R y
. Ia menggunakan tiga jenis rotasi.C, 839 byte
Karena ini bukan program lengkap (berfungsi dengan input dari argumen string dan output ke konsol), Anda perlu menyebutnya seperti ini:
Gunakan hanya satu panggilan pada satu waktu karena fungsi menggunakan dan memodifikasi variabel global.
Tidak Disatukan:
Seperti yang Anda lihat, ide utamanya adalah menggunakan pendekatan yang sepenuhnya didorong oleh data: Rotasi yang berbeda dinyatakan sebagai daftar indeks yang harus diijinkan. Kode permutasi bisa sangat pendek dan generik.
sumber
f(h,g)int*g;{
-2,l(g,m){
-8,n(char*o){
-5,printf("%s",a)
hinggaputs(a)
-7, dan Anda juga dapat mengganti konstanta char dengan masingSecara kubik , 2 byte
Cobalah online!
Penjelasan:
Jika output asing diizinkan, ini merupakan alternatif. 1 byte:
Cobalah online!
Secara otomatis kubus memori kubusnya
STDERR
ketika program berakhir. Namun, ia juga mencetak notepad sebelumnya.sumber
+1
JavaScript (ES6), 820
Porting jawaban buggy oleh @Paul Schmitz. Ini masih belum sepenuhnya golf, tetapi memiliki nilai tambah yang berfungsi.
Masalah utama dalam jawaban asli adalah bahwa fungsi tunggal Q tidak cukup untuk semua gerakan yang terlibat dalam rotasi. Saya harus menambahkan 2 fungsi lainnya O dan N. Semuanya dipanggil dalam fungsi rotasi kanan R.
Mungkin lebih mudah dibaca
sumber
update()
tidak didefinisikan dalam konsol saya saat menjalankan cuplikan