:?
:
#/)
\ #
!"*@
"
Cobalah online!
Ini menampilkan hasil dalam urutan yang C, B, A
dipisahkan oleh umpan baris.
Penjelasan
Seperti biasa, primer Labirin pendek:
- Labyrinth memiliki dua tumpukan bilangan bulat presisi-arbitrary, main dan aux (iliary), yang awalnya diisi dengan jumlah nol tak terbatas (implisit). Kami hanya akan menggunakan utama untuk jawaban ini.
- 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.
Meskipun dua no-ops ( "
) yang membuat tata letak tampak agak boros, saya cukup senang dengan solusi ini, karena aliran kontrolnya sebenarnya cukup halus.
IP dimulai di sudut kiri atas di sebelah :
kanan. Ini akan segera menemui jalan buntu ?
dan berbalik, sehingga program sebenarnya dimulai dengan potongan kode linier ini:
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
Itu berarti kita sekarang punya tiga salinan dari n
tumpukan utama, tetapi kedalamannya 4
. Itu nyaman karena itu berarti kita dapat menumpuk kedalaman untuk mengambil pengganda saat ini sambil bekerja melalui salinan input.
IP sekarang memasuki loop 3x3 (searah jarum jam). Perhatikan bahwa #
, yang mendorong kedalaman tumpukan, akan selalu mendorong nilai positif sehingga kita tahu IP akan selalu berbelok ke timur pada saat ini.
Badan loop adalah ini:
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
Setelah loop dilalui (hingga !
) tiga kali, semua salinann
digunakan dan nol di bawahnya terungkap. Karena "
di bagian bawah (yang jika tidak tampak cukup berguna) posisi ini adalah persimpangan. Itu berarti dengan nol di atas tumpukan, IP mencoba untuk terus lurus ke depan (barat), tetapi karena ada dinding itu benar-benar membuat berbelok 180 derajat dan bergerak kembali ke timur seolah-olah itu telah menemui jalan buntu.
Akibatnya, bit berikut sekarang dieksekusi:
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A
) jika itu ditentukan dengan jelas dalam jawabannya?