Tantangan ini adalah hadiah untuk ais523 untuk memenangkan para " Rookie of the Year " kategori dalam " Best of PPCG 2016 ". Selamat!
BackFlip adalah bahasa pemrograman esoterik yang dibuat oleh pengguna ais523 , yang telah menciptakan lebih dari 30 esolangs menarik lainnya .
BackFlip adalah bahasa 2D seperti Befunge atau > <> di mana penunjuk instruksi melintasi kotak teks (program), bergerak ke atas, ke bawah, ke kiri, dan ke kanan, mengubah arah tergantung pada karakter yang aktif. Secara kritis, kisi-kisi dalam program BackFlip berubah saat sedang dilalui, sedikit mirip dengan Langton's Ant .
Untuk tantangan ini, Anda dapat mengasumsikan bahwa program BackFlip selalu berupa kisi-kisi teks persegi panjang (semua garis memiliki panjang yang sama), ukuran minimal 1 × 1, hanya berisi karakter ./\<>^V
. ( .
digunakan untuk visibilitas daripada ruang.) Semantik BackFlip yang akan kami gunakan di sini identik dengan spesifikasi asli .
Instruksi penunjuk (IP) di BackFlip selalu dimulai tepat di kiri atas sudut kiri program, menuju ke kanan. Ada tiga jenis perintah itu dapat menemukan:
.
adalah no-op. IP melanjutkan ke arah yang sedang terjadi. No-op tetap no-op./
dan\
merupakan cermin. Mereka memantulkan IP ke arah yang ditunjukkan oleh sudut mereka, kemudian mereka berubah menjadi jenis cermin lainnya .- Misalnya, jika kepala IP dibiarkan menjadi
\
, mulai bergerak ke atas, bukan ke kiri dan\
menjadi/
.
- Misalnya, jika kepala IP dibiarkan menjadi
<
,>
,^
, DanV
adalah anak panah. Mereka mengarahkan IP ke arah yang mereka tuju, kemudian mereka berubah menjadi panah yang menunjuk ke arah IP berasal (berlawanan dengan arah IP bergerak) .- Sebagai contoh, jika IP mengarah ke bawah
>
, ia mulai bergerak ke kanan, bukan ke bawah dan>
menjadi^
karena itu adalah arah IP berasal.
- Sebagai contoh, jika IP mengarah ke bawah
Program BackFlip berakhir ketika IP bergerak keluar dari batas, yaitu keluar dari grid. Ternyata semua program BackFlip akhirnya berakhir karena loop tak terbatas tidak mungkin. (Anda mungkin menganggap ini benar.)
Tujuan Anda dalam tantangan ini adalah untuk menulis program atau fungsi yang mengambil dalam program BackFlip dan menampilkan jumlah gerakan yang dilakukan oleh penunjuk instruksi sebelum program berakhir. Yaitu, berapa banyak langkah yang diambil IP dalam menjalankan program? Ini termasuk langkah awal ke grid dan langkah terakhir darinya.
Misalnya, penunjuk instruksi mengambil 5 langkah di kotak sepele ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Jadi hasilnya ....
adalah 5
.
Dalam lebih kompleks 4 × 2 kotak
\...
\.><
IP keluar dari kotak pada langkah 9, sehingga output adalah 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Kode terpendek dalam byte menang.
Anda dapat mengambil input sebagai array garis atau matriks karakter, bukan string multiline jika diinginkan, tetapi Anda harus menggunakan karakter ./\<>^V
(bukan opcode integer). Anda dapat menggunakan ruang alih-alih .
jika lebih disukai. Tidak apa-apa jika karakter seperti \
perlu melarikan diri dalam input. Output selalu integer lebih dari satu.
Uji Kasus
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
sumber
/
akan membuat IP naik dan menuju ke atas/
akan membuat IP kanan, seolah-olah itu adalah bola yang memantul ke dinding. (Tapi ingat/
perubahan backslash setelah IP menyentuhnya.)Jawaban:
JavaScript (ES6), 158 byte
Dikembangkan secara independen dari jawaban @ tsh meskipun sangat mirip.
Pemetaan arah
^<v>
ke bilangan bulat 0-3 diatur oleh fakta bahwa.search('^')
mengembalikan 0 karena^
adalah metacharacter regexp.sumber
Haskell ,
333325 byteEDIT:
f
pointfree dan digabung menjadib
.b
mengambil daftarString
s dan mengembalikan sebuahInteger
.Cobalah online!
Bagaimana itu bekerja
C a
adalah tipe data yang digunakan karena Haskell tidak akan mengizinkan suatu tipe menjadi rekursif tanpa menyatakannya secara eksplisit.C
juga merupakan konstruktor pembungkus danc
merupakan fungsi buka bungkusnya yang sesuai. Hanya digunakan dengana=[Int]
.C [Int]
mewakili perintah sel, sebagai fungsi yang mengambil[Int]
argumen direction ( ), dan mengembalikan sepasang arah baru, danC [Int]
nilai baru .b
adalah fungsi utama. Itu mengkonversi setiap karakter menjadiC
nilai, lalu itu panggilan#
.g
adalah kisi sebagai daftar string.\
perlu untuk melarikan diri dan karakter terpanjang yang disebutkan, hasilnya malah digunakan sebagai nilai default untuk pencarian daftar.#
menjalankan simulasi utama, memeriksa batas dengan&
dan menghasilkan grid baru dengan?
.[y,x]
adalah posisi saat ini,d
arah saat ini, dang
kisi saat ini.[f,e]
adalah arah berikutnya, dann
merupakan pasangan dari itu dan kotak berikutnya.l&i
memeriksa apakah indeks dii
luar batas untuk daftarl
. (Ini kembaliTrue
keluar dari batas, karena itu menghindari kondisi penjaga boneka#
.)f(l!!i)==(d,x)
, di(f?i)l==(d,m)
manam
daftarl
dengani
elemen th diganti denganx
.(?i)
adalah lensa yang lebih umum, dengan fokus pada elemen ke-10 dari daftar, dalam hal ini digunakan dengan(,) [Int]
instance functor.n
adalah fungsi yang mewakili sebuah titik.a v
adalah fungsi yang mewakili panah ke arahv
.m s
adalah fungsi yang mewakili cermin;s==1
untuk\\
dans==-1
untuk/
.sumber
JavaScript, 172 byte
Tetapi saya tidak dapat menguji testcase terakhir karena saya mendapat stack overflow pada mesin saya. (harus bekerja jika ada mesin dengan ram lebih besar)
Kami menggunakan nomor untuk arah:
Biarkan
d
menjadi nomor arah ...Membiarkan
(x, y)
menjadi posisi saat ini, posisi berikutnya adalah:x+(t&1&&t-2)
,y+(~t&1&&t-1)
catatan:
Fungsi ini mengambil satu paramter dengan format berikut:
Uji di sini
sumber
Uncaught RangeError: Maximum call stack size exceeded
dengan 16GB RAM.var
deklarasi membuatnya lulus testcase terakhir (penerjemah js melakukan optimasi panggilan ekor dalam mode ketat)C,
232221 byteMengambil input dalam argumen pertama, mencetak hasil. Membutuhkan input yang mengandung setidaknya 1 baris baru (jadi jika hanya ada 1 baris, harus diakhiri dengan baris baru)
Contoh penggunaan:
Kerusakan:
sumber
Python 3 , 286 byte
[f () mengambil input dalam bentuk
{(0,0):'/',(0,1):'.'}
jadi saya juga menulis fungsi g () untuk mengonversi array baris ke bentuk itu]Cobalah online!
sumber