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
/
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.)