Labyrinth , 28 25 24 23 22 byte
" >
?!?:|}\{@
@\?"":)!
Ini sangat menyenangkan! :) Itu adalah program Labirin yang paling padat yang saya tulis sejauh ini. Saya memiliki begitu banyak versi pada 20 dan 21 byte yang hampir berfungsi sehingga saya masih meragukan ini optimal ...
Ini mengambil input sebagai daftar bilangan bulat positif (dengan pembatas arbitrer), dan mencetak hasilnya ke STDOUT sebagai bilangan bulat yang dibatasi linefeed.
Perburuan untuk 20/21 byte: Saya telah memeriksa semua program formulir
" XX
?!?X}\{@
@\?XX)!
di mana X
ada karakter yang masuk akal dengan kekerasan, tetapi tidak menemukan solusi yang valid Tentu saja itu tidak berarti bahwa solusi yang lebih pendek tidak ada, tetapi itu tidak mungkin untuk memaksa program 20-byte tanpa jumlah asumsi yang layak pada strukturnya.
Penjelasan
(Penjelasannya agak ketinggalan jaman, tapi saya masih tidak yakin solusinya optimal, jadi saya akan menunggu dengan memperbarui ini.)
Jadi, biasanya program Labirin seharusnya terlihat seperti labirin. Sementara penunjuk instruksi berada di koridor, itu akan mengikuti koridor itu. Ketika IP mencapai segala jenis persimpangan, arah ditentukan berdasarkan nilai teratas tumpukan utama Labyrinth (Labyrinth memiliki dua tumpukan, dengan jumlah nol yang tak terbatas di bagian bawah). Itu biasanya berarti bahwa setiap loop non-sepele akan cukup mahal, karena jika Anda memiliki sel-sel non-dinding di semua tempat semuanya adalah persimpangan, dan dalam kebanyakan kasus bagian atas tumpukan tidak akan memiliki nilai yang tepat untuk IP untuk mengambil jalan yang Anda inginkan. Jadi apa yang Anda lakukan adalah memperbesar loop sehingga mereka memiliki keseluruhan di tengah dengan hanya satu titik masuk dan keluar yang ditentukan masing-masing.
Tapi kali ini aku benar-benar beruntung dan semuanya cocok satu sama lain, sehingga aku bisa meremasnya menjadi satu rumpun besar. :)
Aliran kendali dimulai dari _
Selatan yang sedang berjalan. The _
mendorong nol ke stack utama. Itu mungkin tampak seperti no-op, tetapi ini meningkatkan kedalaman stack (non-implisit) 1
yang akan kita butuhkan nanti.
?
membaca bilangan bulat dari STDIN. Jika tidak ada lagi bilangan bulat untuk dibaca, ini mendorong nol. Dalam hal ini, IP terus bergerak ke Selatan dan segera @
menghentikan program (karena daftar input kosong). Kalau tidak, IP berubah menjadi Timur.
Kami sekarang memasuki lingkaran yang sangat ketat dengan dua titik keluar:
!?;
\?
;
!
mencetak bilangan bulat kembali ke STDOUT, hanya menyisakan nol pada tumpukan. IP terus bergerak ke Timur, dan ?
membaca bilangan bulat berikutnya. Jika itu bukan nol, kita ambil kanan dan bergerak ke Selatan. ?
membaca yang lain (indeks genap berikutnya). Sekali lagi, jika itu bukan nol, kita ambil kanan dan bergerak Barat.
Kemudian \
mencetak umpan baris tanpa mengubah tumpukan, jadi kami ambil kanan lagi, bergerak ke Utara. !
mencetak bilangan bulat bahkan indeks berikutnya. Karena sekarang ada setidaknya satu integer indeks ganjil (positif) pada stack, kami terus berbelok ke kanan dan loop berulang.
Begitu salah satu dari mereka ?
mencapai akhir daftar, mereka menekan nol dan bergerak langsung ke yang sesuai ;
, yang membuang nol itu.
Dalam hal hanya ada satu elemen dalam daftar, kita sudah selesai (karena kita sudah mencetaknya segera), sehingga IP akan terus bergerak ke Timur hingga ke @
, lagi-lagi mengakhiri program (mencetak trailing linefeed di jalan).
Kalau tidak, kita perlu mencetak bilangan bulat indeks ganjil juga. Dalam hal ini dua jalur (dari dua titik keluar dari loop pertama) bergabung di tengah "
, berbelok ke Timur dalam kedua kasus.
_
mendorong nol untuk menghindari mengambil kiri ke dalam @
, dan ;
membuang nol itu. Sekarang kita masuk ke loop baru:
"}
""
IP memasuki ini di sel kiri bawah, bergerak ke utara, berputar di sekitar searah jarum jam. The }
menggeser atas tumpukan utama ke tumpukan tambahan. Meskipun masih ada elemen di stack, IP terus melakukan tugasnya. Setelah semuanya telah bergeser ke tumpukan bantu (dan terbalik dalam proses), IP terus bergerak ke Timur sebagai gantinya, memasuki loop terakhir:
\{@
#!
\
mencetak linefeed lagi, {
memindahkan item dari tumpukan tambahan kembali ke utama. Jika itu masih merupakan item dari daftar, itu akan menjadi positif, dan IP berbelok ke Selatan, di mana item tersebut dicetak !
. Kemudian #
dorong kedalaman tumpukan (dan sekarang inilah awal _
yang penting, karena ini #
memastikan kedalaman tumpukan positif), sehingga IP masih berbelok ke kanan, melewati \
dan {
lagi.
Setelah kami mencetak semuanya, {
menarik nol dari bagian bawah tumpukan tambahan, IP melanjutkan ke Timur, dan @
menghentikan program.