Saya dengan bangga memperkenalkan ...
<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
? @
:" }}_47}_95 3""""""""(
_ : } _ } {=}
2 23_}29_ _ ; : \
0 ; 3 +_( 3_" 60{ .{.{.
"-_95:}}"" 2 0 ) 2 " _ _ {
"" _ : 2 _ ."(; } 3 .{
;_92}_47} : _ 0 = : * ;
: "" 2 {.{{ . -""(
}}:59_}}:::: "";_ . { _ "
} " {.{.{. 32.
}}}_95:}}}}_20-
... Labyrinth esolang dua dimensi baru saya! Kode di atas tidak golf dengan sangat baik (ada 161 ruang dan 25 NOP, jadi tata letak yang lebih baik dapat mempersingkat ini banyak), tapi setidaknya saya berhasil menunjukkan bahwa bahasa tersebut dapat digunakan untuk tugas-tugas non-sepele. :)
Bagaimana itu bekerja
Pertama, ikhtisar singkat bahasa:
- Labirin beroperasi pada dua tumpukan, utama dan tambahan , yang dapat menampung bilangan bulat yang ditandatangani secara sewenang-wenang. Di bagian bawah kedua tumpukan ada nol yang tak terbatas.
- Perintah adalah karakter individu pada kisi 2D dan membentuk sebuah labirin (yaitu karakter yang tidak dikenal, terutama spasi, adalah dinding).
"adalah NOP yang bukan dinding dan dapat membantu untuk mengisi jalur tertentu dalam kode. Berbeda dengan banyak bahasa 2D lainnya, ujung-ujungnya tidak membungkus.
- Instruksi penunjuk (IP) dimulai pada karakter non-dinding pertama (dalam urutan membaca) bergerak ke kanan.
@mengakhiri program.
- Jika memungkinkan, IP mengikuti koridor (juga di sekitar tikungan). Jika IP memiliki banyak sel untuk dipindahkan, umumnya akan berbelok ke kiri jika bagian atas tumpukan utama negatif, bergerak lurus ke depan jika nol, atau berbelok ke kanan jika positif. Ketika IP menyentuh dinding, ia membalikkan arah. (Ada beberapa seluk-beluk lagi, tetapi mereka seharusnya tidak masalah untuk kode ini.) Ini adalah satu-satunya cara untuk menerapkan aliran kontrol.
- Terlepas dari perintah manipulasi aritmatika dan stack, kode sumber dapat dimodifikasi pada saat runtime dengan empat perintah
>v<^yang akan menggeser baris atau kolom kode sumber secara siklus dengan satu sel. Baris atau kolom mana yang terpengaruh tergantung pada bagian atas tumpukan. Jika baris atau kolom IP sendiri bergeser, ia akan bergerak dengan bergeser. Ini memungkinkan untuk melompat dari satu tepi kode sumber ke yang lain.
Sekarang untuk tantangan khusus ini, berikut adalah ide umum dari algoritma:
- Dorong ujung mobil ke kap (yaitu
/ \_o oo o) ke tumpukan tambahan.
- Baca input dan tentukan apakah akan mendorong
__atau /\berikutnya.
- Dorong sisa mobil (yaitu
__ __ _/ \dan dua ruang utama) ke tumpukan tambahan.
- Jepit input ke nilai maksimum
20, sebut saja N ini .
- Sekarang lakukan 3 kali berikut:
- Cetak N spasi.
- Cetak 6 karakter tersimpan.
- Cetak 60 - 3 * N spasi.
- Cetak 6 karakter tersimpan.
- Cetak baris baru.
Akhirnya, mari kita lihat beberapa bagian kode. IP dimulai di sudut kiri atas, pada perintah grid shifting. Bagian atas tumpukan utama adalah 0(yang digunakan sebagai indeks relatif), sehingga baris pertama digeser ke kiri, yang juga memindahkan IP ke ujung kanan grid. Sekarang baris pertama dijalankan dari kanan ke kiri, yang mendorong set karakter tetap pertama ke tumpukan tambahan:
}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<
Pergeseran baris ini berguna untuk bermain golf saat Anda ingin memulai dengan sejumlah besar kode linier.
Selanjutnya kita membaca input dan mendorong kap yang benar:
?
:"
_
2
0 ;
"-_95:}}""
"" _
;_92}_47}
Bit di sebelah kiri dengan tiga NOP mengirimkan hasil negatif di sepanjang cabang atas dan hasil non-negatif di sepanjang cabang bawah. Di sebelah kanan mereka disatukan kembali.
Sekarang ikuti bagian linier besar lainnya (yang mungkin bisa banyak bermain golf dengan trik pengalihan baris lainnya):
}}_47}_95
: }
23_}29_ _
3
2
:
:
:
}}:59_}}::::
}
}}}_95:}}}}
Ini mendorong sisa mobil ke tumpukan tambahan.
Selanjutnya, kami menghitung min(20, input), yang mirip dengan cabang pertama:
;
+_(
0 )
2 _
_ 0
"" 2
"";_
"
_20-
Akhirnya, kita memiliki loop yang berjalan tiga kali untuk mencetak garis. Setiap iterasi dari loop berisi dua loop kecil (3x3) untuk mencetak spasi, serta dua bagian untuk mencetak 6 karakter dari stack tambahan:
@
3""""""""(
_ } {=}
: \
3_" 60{ .{.{.
2 " _ _ {
."(; } 3 .{
= : * ;
{.{{ . -""(
. { _ "
{.{.{. 32.
Satu trik bagus yang ingin saya perhatikan adalah .{.{.pada ujung kanan. Ini adalah jalan buntu, jadi selain dari .pada akhirnya kode dieksekusi dua kali, sekali maju dan sekali mundur. Ini memberikan cara yang rapi untuk memperpendek kode palindrom (tangkapannya adalah Anda perlu memastikan IP mengambil belokan yang benar ketika keluar dari jalan buntu lagi).
/ \dan turun_ _?