`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Kolaborasi lain dengan @ MartinBüttner dan di sisi yang lebih gila dari spektrum Labyrinth - untuk pertama kalinya kami memiliki keempat ^>v<
dalam satu program. Cobalah online!
Penjelasan
Algoritma umum, yang berjalan dalam satu lingkaran, adalah sebagai berikut:
1. Read a char
2. If EOF:
3. Move all digits from auxiliary stack to main
4. Output all digits on main stack
5. Halt
Otherwise:
6. If char is a letter (c >= 64):
7. If random turns left:
8. Output char XOR 32
Otherwise:
9. Output char
Otherwise:
10. Shift char to auxiliary stack
11. If char is space (c-32 == 0):
12. Pull char back from auxiliary stack
13. Output underscore
Otherwise:
14. Continue loop
Untuk menjaga penjelasannya tetap ringkas, inilah kira-kira bagaimana setiap bagian dari program sesuai dengan pseudocode di atas:
Inilah bagian yang menarik.
Mendapatkan keacakan dalam Labyrinth
Hanya ada satu cara untuk mendapatkan keacakan di Labyrinth, dan itu ketika IP mencoba untuk maju tetapi 1) tidak ada jalan maju atau mundur dan 2) ada jalan yang tersedia kiri dan kanan. Dalam hal ini, IP secara acak memilih antara rute kiri dan kanan.
Ini hanya mungkin menggunakan ^>v<
operator, yang membuang n
dan menggeser baris / kolom n
sebanyak 1. Misalnya, program ( Coba online! )
" 1
""v!@
2
!@
output 1 atau 2 secara acak, karena v
menggeser kolom dengan offset 0 (yaitu kolom IP aktif) dengan 1, menghasilkan
"
""1!@
v
2!@
IP menghadap ke kanan dan mencoba untuk maju (atas tumpukan adalah nol) tetapi tidak bisa. Itu juga tidak bisa bergerak mundur, sehingga secara acak memilih antara kiri atau kanan.
Trik golf
Program dimulai dari karakter pertama dalam urutan pembacaan, yang akan Anda perhatikan sebenarnya adalah langkah 6. Namun, muncul dari tumpukan Labirin kosong menghasilkan 0, sehingga langkah 10 dan 14 terjadi, menggeser nol ke tumpukan tambahan, yang secara efektif no-op.
Tumpukan utama secara efektif kosong setelah setiap iterasi, yang memungkinkan kita untuk bermain golf tata letak kode dengan menggunakan >
dan <
pada nol tersirat di bagian bawah. The >
membungkus baris bawah sekitar sehingga bergerak IP dari kanan bawah ke kiri bawah, dan <
pergeseran barisan belakang. IP kemudian dengan senang hati bergerak ke atas kolom kiri untuk melanjutkan loop.
Digit di pop Labyrinth n
dan tekan 10*n + <digit>
. Selain itu, karakter diambil modulo 256 sebelum menjadi output. Menyatukan keduanya memungkinkan kita menghasilkan 95 (garis bawah) dengan melakukan `33
ke 32 (spasi), yang berhasil karena -3233 % 256 = 95
. Meskipun ada cara lain untuk mengubah 32 menjadi 95 ( ;95
menjadi yang termudah), bekerja dengan angka negatif di sini memungkinkan kita untuk memadatkan kode sedikit dengan belokan kiri.