Rubik's Cube standar, terpecahkan, 3 × 3 × 3 memiliki 6 wajah berwarna berbeda, di mana setiap wajah adalah kotak 3 × 3 kotak dengan satu warna. Wajah putih berlawanan dengan kuning, oranye berlawanan merah, biru berlawanan hijau, dan ketika putih menunjuk ke atas, merah di sebelah kiri biru:
Bayangkan seekor semut duduk di tengah-tengah wajah putih, menghadap wajah merah. Anda bisa memberinya 3 perintah:
- Maju (
^
) - ambil langkah ke arah yang dia hadapi ke kotak persegi berikutnya, melangkahi tepi kubus jika perlu. - Kanan (
>
) - putar ke kanan (searah jarum jam) sebesar 90 °, tinggal di kotak yang sama. - Kiri (
<
) - putar ke kiri (berlawanan arah jarum jam) sebesar 90 °, tetap di kotak yang sama.
Diberikan daftar perintah yang sewenang-wenang, temukan warna kotak yang dikunjungi semut (tidak termasuk kotak awal putih).
Misalnya, urutan perintah
^^>^^<^^^
memiliki lintasan yang terlihat seperti ini:Warna kotak kotak dikunjungi secara berurutan, tidak termasuk awal kuadrat, sedang
white red red green green green yellow
, atau adilwrrgggy
.
Tulis program atau fungsi yang mengambil string karakter perintah <^>
dan mencetak atau mengembalikan string karakter wyrobg
(putih, kuning, oranye merah, biru, hijau) yang sesuai dengan jalur semut di atas kubus.
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya.
Catatan
- Kubus ada di udara dan semut memiliki pulvili yang efektif, sehingga ia dapat melintasi seluruh kubus.
- Kubus selalu tetap dalam kondisi terpecahkan.
- Warna kotak hanya dicatat saat pergerakan ke kotak, bukan rotasi. Kotak putih awal tidak boleh direkam.
- Baris trailing opsional tunggal dapat hadir dalam input dan / atau output.
Uji Kasus
input : output
[empty string] : [empty string]
^ : w
< : [empty string]
> : [empty string]
><><<<>> : [empty string]
>^ : w
<<^> : w
^<^<^<^< : wwww
^^ : wr
<^^ : wb
>><<<<^^ : wo
<^^^<^^^^<>^>^^>^ : wbbboooggyo
^^^^^^^^^^^^^^ : wrrryyyooowwwr
<<<^<^>^<^<^<^>^^^^<^>>>>>^^<^>^^<^>^>^>^>< : wwgrwgggoooobbbbyrby
^^>^^<^^^ : wrrgggy
sumber
Jawaban:
Perl,
156143134128127125120119117113109 byteTermasuk +1 untuk
-p
Jalankan dengan string kontrol pada STDIN, mis
rubic.pl
:Penjelasan
Versi yang lebih lama:
Tantangan dari pertanyaan ini adalah menemukan sistem koordinat yang membuatnya mudah melacak posisi dan arah semut dan masih mudah mendapatkan identitas wajah.
Sistem yang saya pilih adalah dengan meletakkan
(x,y)
koordinat standar pada wajah semut pada sehingga semut selalu menghadap key
arah negatif dengan pusat wajah sedang(0,0)
. Begitu:Jika
y
sudah-1
semut akan meninggalkan wajah saat ini dan melangkah ke yang berikutnya. Dalam sistem koordinat barux
tetap ada nilainya, tetapiy'
menjadi 1.Ini memberikan sistem koordinat yang mudah di dalam wajah. Saya juga butuh sesuatu untuk wajah mereka sendiri. Di sana saya menggunakan array yang terdiri dari
Jadi array awal adalah
(g,b,o,y,r,w)
. Pindah ke wajah berikutnya sama dengan memutar 4 elemen terakhir, jadi pindah dari putih ke merah membuatnya(g,b,w,o,y,r)
. Belok kanan adalah permutasi dari 5 elemen pertama yang diberikan(o,r,b,y,g,w)
. Belok kiri adalah permutasi simular tetapi juga dapat dilakukan dengan belok kanan 3 kali, jadi menerapkan permutasi ini 3 kali. Dan tidak berputar sama sekali juga bisa dilakukan dengan menerapkan permutasi 8 kali. Bahkan berbelok ke kanan juga bisa dilakukan dengan menerapkan permutasi 5 kali.Mengetahui ini programnya agak sederhana:
Jadi untuk itu rotasi pernyataan terakhir mengarah ke string kosong dan langkah maju mengarah ke wajah saat ini. Karenanya
$_
akan digantikan oleh wajah yang dikunjungi pada setiap langkah.sumber
@1
bit itu adalah penyalahgunaan luar biasa dari apa yang tampak seperti fitur bahasa yang mengerikan.use strict
. Terima kasih untuk modulo 3 omong-omong.Brachylog , 287 byte
Mengharapkan string berisi gerakan sebagai Input, dan tidak ada Output, misalnya
brachylog_main("^^>^^<^^^",_).
akan menuliswrrgggy
ke STDOUT.Penjelasan
Kode SWI-Prolog yang Setara
Jika Anda tidak ingin repot dengan kompiler Brachylog, Anda dapat menjalankan solusi ini di SWI-Prolog menggunakan kode berikut (inilah yang dihasilkan oleh kompiler Brachylog):
sumber
PowerShell, 882 byte
Pemakaian
Simpan kode dalam skrip dan panggil seperti ini dari baris perintah. Dengan asumsi direktori kerja adalah direktori saat ini.
Kode
Kode golf kurang dengan penjelasan
Menggunakan banyak variabel huruf tunggal yang digunakan untuk merekam keadaan semut saat ini (warna, posisi dan orientasi). Semut selalu menghadap ke atas. Ketika instruksi rotate dibaca, kubus ditransformasikan ke arah itu. Matriks transposisi hardcoded digunakan untuk menentukan posisi baru berdasarkan posisi saat ini.
Kode memenuhi semua contoh yang dipermasalahkan.
sumber
Tcl / Tk, 422 byte
Sayangnya, saya tidak bisa mendapatkannya lebih kecil. Versi tidak dikaburkan:
Ia bekerja dengan mempertahankan daftar warna sel horizontal dan vertikal. ^ <dan> adalah semua perintah yang mengubah daftar dengan benar. Sel saat ini adalah yang pertama di setiap daftar.
sumber
Ruby, 132
Sistem posisi ini sayangnya sangat mirip dengan jawaban lain di luar sana.
x
danz
lacak posisi Anda di wajah saat ini dengan+x
menjadi arah perjalanan. Maju selalux+=1
, dan batas-batas setiap wajah dapat dibagi dengan 3 (kami tidak peduli nomornya, hanya modulusnya dengan 3).m
adalah wajah saat ini (ini menghemat beberapa byte)g
diatur[left, right, behind, opposite, front]
sehingga kita tidak perlu perubahang[0..1]
pada^
<
dilakukan hanya dengan melakukan>
tiga kali.sumber
Java,
619605 byteNah, ini dia ...
Setidaknya itu mengalahkan PowerShell!
-14 byte terima kasih kepada @KevinCruijssen
Penjelasan:
Tidak seperti beberapa jawaban lain, yang digunakan menggunakan sistem koordinat 2-d, saya menggunakan sistem 3-d untuk melacak di mana semut itu berada.
Arah juga disimpan dalam mode 3-d untuk memfasilitasi pergantian sisi dan gerakan.
Setiap wajah memiliki salah satu koordinat, x, y, atau z, ditetapkan ke 2 (atau -2 untuk wajah yang berlawanan) untuk menandakan wajah yang mana.
Mengganti wajah dilakukan dengan memeriksa apakah semut hendak mati (posisi dan pos memiliki nilai yang sama, tetapi bukan 0), pastikan semut akan "jatuh" secara diagonal ke yang berikutnya, dan ubah pos menjadi tidak -diagonal. Ini sangat mudah.
Berbelok lebih sulit. Memastikan itu akan selalu pergi ke arah yang sama diperlukan pernyataan if-else tambahan di dalam cek untuk setiap karakter, biaya saya banyak byte. Selain itu, sumbu "atas" dan "kanan" harus dikodekan keras untuk masing-masing sisi.
Kode tidak dikunci
(Tidak diubah dari hasil edit sebelumnya untuk kejelasan metode)
sumber
d[]={"w","g","r","b","o","y"}
->"w,g,r,b,o,y".split(",")
(-1 byte); 2x'^'
->94
(-2 bytes); 3x==0
-><1
(-3 bytes); 2x==1
-><2
(-2 bytes); dll untuk==2
,==3
,==4
,==5
.