_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
Berakhir dengan kesalahan pembagian-oleh-nol (pesan kesalahan pada STDERR).
Cobalah online!
Tata letaknya terasa sangat tidak efisien tapi saya tidak melihat cara untuk golf sekarang.
Penjelasan
Solusi ini didasarkan pada trik aritmatika Dennis: ambil semua kode karakter modulo 8
, tambahkan pasangan dari kedua ujungnya dan pastikan itu habis dibagi 5
.
Primer labirin:
- Labyrinth memiliki dua tumpukan bilangan bulat presisi-arbitrary, main dan aux (iliary), yang awalnya diisi dengan jumlah nol tak terbatas (implisit).
- Kode sumbernya menyerupai sebuah labirin, tempat penunjuk instruksi (IP) mengikuti koridor ketika bisa (bahkan di sekitar sudut). Kode dimulai pada karakter valid pertama dalam urutan membaca, yaitu di sudut kiri atas dalam kasus ini. Ketika IP datang ke segala bentuk persimpangan (yaitu beberapa sel yang berdekatan selain dari yang berasal dari), ia akan memilih arah berdasarkan bagian atas tumpukan utama. Aturan dasarnya adalah: belok kiri saat negatif, teruskan ke depan ketika nol, belok kanan saat positif. Dan ketika salah satu dari ini tidak mungkin karena ada dinding, maka IP akan mengambil arah yang berlawanan. IP juga berbalik ketika mengenai jalan buntu.
- Digit diproses dengan mengalikan bagian atas tumpukan utama dengan 10 dan kemudian menambahkan digit.
Kode dimulai dengan 2x2 kecil, searah jarum jam, yang membaca semua input modulo 8:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
Sekarang ;
buang -1
. Kami memasukkan loop searah jarum jam yang menggerakkan bagian atas tumpukan utama (yaitu karakter terakhir) ke bawah:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
Sekarang ada sedikit linier pendek:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
IP sekarang berada di persimpangan yang bertindak sebagai cabang untuk menguji kemampuan dibagi dengan 5. Jika hasil dari modulo adalah nol, kita tahu bahwa input bukan palindrom Watson-Crick dan kami berbelok ke timur:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
Kalau tidak, kita harus terus memeriksa sisa input, sehingga IP terus ke selatan. The {
tarikan atas bawah masukan yang tersisa. Jika kami telah kehabisan input, maka ini akan menjadi 0
(dari bawah aux ), dan IP terus bergerak ke selatan:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
Jika tidak, ada lebih banyak karakter dalam string yang akan diperiksa. IP berubah ke barat dan bergerak ke loop 2x2 (searah jarum jam) berikutnya yang sebagian besar terdiri dari no-ops:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
Setelah loop ini, kami mendapat input pada tumpukan utama lagi, kecuali untuk karakter pertama dan terakhir dan dengan nol di atas. The ;
membuang yang 0
kemudian =
swap puncak tumpukan, tapi ini hanya untuk membatalkan pertama =
dalam lingkaran, karena kita sekarang sedang memasuki loop di lokasi yang berbeda. Bilas dan ulangi.