Tugas Anda adalah membuat urutan gerakan secara acak, yang dapat digunakan untuk mengacak Rubik's Cube. Perebutan seperti itu terdiri dari 25 gerakan. Setiap gerakan terdiri dari huruf-huruf yang UDRLFB
secara opsional diikuti oleh salah satu sufiks '2
.
Notasi ini disebut notasi Singmaster. UDRLFB
mewakili salah satu dari 6 wajah dan akhiran opsional '2
mewakili sudut belok. Informasi ini sama sekali tidak diperlukan untuk menyelesaikan tugas.
Untuk memastikan, bahwa perebutan adalah 'berkualitas baik', dua aturan berikut harus diterapkan:
Dua gerakan berurutan tidak boleh memiliki huruf yang sama. Ini melarang bergerak berturut-turut
UU
,DD
,RR
,LL
,FF
danBB
dan semua kombinasi mereka menggunakan akhiran opsional sepertiU2U
atauU'U'
.Pasangan bergerak ini dilarang, karena mereka dapat dengan mudah dikurangi menjadi 1 atau 0 bergerak.
U2U
memiliki efek yang sama denganU'
,R'R
efek yang sama dengan.
Tiga gerakan berurutan tidak boleh dari grup surat yang sama. Grup surat adalah
UD
,RL
danFB
. Aturan ini juga melarang bergerak berturut-turutUDU
,DUD
,RLR
,LRL
,FBF
,BFB
dan semua kombinasi mereka menggunakan akhiran opsional sepertiU2DU
,RL'R
atauB2FB'
.Kelompok-kelompok mengurutkan wajah berdasarkan sumbu gerak mereka.
U
danD
berada dalam kelompok yang sama, karena keduanya berbalik pada poros yang sama. Karena itu sebuahU
gerakan tidak memengaruhi bagian-bagianD
wajah, dan sebuahD
gerakan tidak memengaruhi bagian-bagianU
wajah. Oleh karena itu kedua gerakan dapat dipertukarkan,UDU
memiliki efek yang sama denganUUD
, dan ini dapat dikurangi menjadiU2D
.
Tantangan
Tulis skrip atau fungsi, yang menghasilkan satu perebutan acak. Tidak ada input. Script / fungsi harus mencetak 25 gerakan tanpa pemisahan atau dipisahkan oleh satu spasi atau mengembalikan string koresponden.
Program Anda harus dapat membuat setiap perebutan tunggal, yang memenuhi aturan di atas. Tentu saja dengan asumsi, bahwa generator angka acak adalah benar-benar acak, dan bukan pseudo acak.
Ini adalah kode-golf. Kode terpendek (dihitung dalam byte ) menang.
Contoh output:
Memanggil script / fungsi 3 kali harus mencetak / mengembalikan sesuatu seperti:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Jika Anda memisahkan gerakan dengan spasi masing-masing:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Perhatikan, bahwa semua output ini terdiri dari 25 gerakan, tetapi memiliki panjang yang berbeda, karena sufiks opsional. Tidak diperbolehkan mencetak spasi, saat salah satu 2
atau '
sedang digunakan sebagai sufiks. Anda harus mencetak L2UR2F'R'U2
atau L2 U R2 F' R' U2
. L2U R2F'R'U2
tidak diizinkan.
sumber
UR 2
tidak diizinkan?U R2
harus diizinkan, saya pikir, karena ruang antar gerakan masuk akal.L2U R2F'R'U2
.U
tidak memiliki akhiran opsional dan karenanya tidak boleh memiliki spasi. Ruang tidak boleh menjadi pengganti untuk akhiran opsional.U F2 L D2 R'...
, misalnya? Dalam hal ini, tidak ada ruang ekstra , yang menurut saya harusnya oke menurut aturan Anda.Jawaban:
CJam,
4745 byteSolusi ini menggunakan pendekatan yang berbeda dari yang lainnya sejauh ini. Ini mengambil keuntungan dari operasi daftar singkat CJam untuk menghasilkan daftar langkah yang tersedia dan memilih satu secara acak setiap iteraton. Pengubah hanya dihasilkan secara independen.
Cobalah online.
Penjelasan
sumber
C, 129
Loop dalam menghasilkan nilai
m
dalam rentang1..5
yang ketika ditambahkans
dan diambil modulo 6, memastikan bahwa tidak ada dua gerakan berturut-turut berada di sisi yang sama dari kubus. Nilai lamam
disimpan dalamn
dan tesm*n==9
memastikan bahwa nilaim
= 3 tidak pernah dihasilkan dua kali berturut-turut (sehingga wajah yang berlawanan tidak dapat diambil dua kali berturut-turut; perhatikan urutan wajah dalam string.)Bagian paling tidak signifikan
r
digunakan untuk memutuskan suffix ('
,2
atau null) mana yang akan digunakan, mengambil keuntungan dari karakter null di akhir"'2"
.Loop luar berjalan 26 kali. Pertama kali,
U
tidak pernah bisa dipetik, sehinggaprintf
ditekan untuk iterasi pertama.Kode yang tidak digabungkan dalam program pengujian
Kode ungolfed memberi jarak antara setiap gerakan untuk kejelasan (kode golf tidak, untuk menghemat satu byte.) Selain itu kode golf menyimpan titik koma dengan memindahkan bagian
printf
dalamfor
braket.Output khas
sumber
Pyth,
6566Saya tidak pernah benar-benar bermain golf di Pyth, mungkin menulis satu atau dua program. Ini pada dasarnya adalah solusi @ steveverrill yang diterjemahkan ke Pyth. Saran perbaikan dipersilahkan.
Pembaruan: ditambahkan 1 byte untuk membuat perebutan juga dimulai dengan
U
. Mungkin solusi C mengandalkan perilaku yang tidak terdefinisi untuk membuatnya bekerja ...Saya percaya ini harus dilakukan dengan tugas yang lebih sedikit, tetapi itu akan mengharuskan saya untuk memodifikasi banyak algoritma. (Yah, mungkin mencoba.)
Berikut penjelasan berdasarkan kode C:
sumber
Y
danZ
.Z
diinisialisasi dengan 0, sehingga Anda menyimpan 3 karakter pertama.n = m
(baris penjelasan ke-3), yang harus berartin = 0
pertama kali, yang pada gilirannya akan perluY
menjadi 0.Y
diinisialisasi dengan daftar kosong[]
. Dan saya tidak berpikir nilai darin
hal dalam iterasi pertama.U
.JavaScript (ES6) 175
178 204Edit 3 byte lebih sedikit, 1 dengan mengubah kode dan 2 dengan mengubah cara byte dihitung (tidak termasuk
F=
)Kode untuk menghindari repetitons diambil dari @stevemiller. Caranya mengelola grup surat bahkan lebih baik, tapi aku tidak akan mencurinya.
Bonus: Anda dapat menentukan jumlah gerakan secara opsional.
Kurang golf
Uji
sumber
Javascript - 112
sumber
Java 8,
189183 bytePelabuhan @LevelRiverSt 's C jawabannya . Saya mencoba beberapa hal sendiri, tetapi ini lebih pendek dari apa yang saya miliki ..
Cobalah online.
sumber
Ruby ,
116 107 10595 byteCobalah online!
sumber
Clojure, 223 byte
Ini sangat bergantung pada pola "sequence -> partisi-by ->> - concat", ini digunakan untuk menyaring urutan wajah "ilegal". Seq ini kemudian dipetakan ke string bersamaan dengan postfix acak (termasuk string kosong).
Titik awal yang tidak disatukan:
sumber