Prelude , 69 55 54 byte
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Jika juru bahasa yang memenuhi standar digunakan, ini mengambil input dan output sebagai nilai byte . Untuk benar-benar menggunakan angka desimal pada STDIN / STDOUT, Anda memerlukan interpreter Python dengan NUMERIC_OUTPUT = True
dan opsi tambahan NUMERIC_INPUT = True
.
Penjelasan
Kerangka program adalah
?1-( 1 -
1 )!
Kami membaca input N
ke suara pertama dan menurunkannya untuk mendapatkan N-1
. Kami juga menginisialisasi suara kedua 1
. Kemudian kita putar N-1
satu kali, setiap iterasi yang mendapatkan nilai urutan berikutnya pada tumpukan kedua. Pada akhirnya kami mencetak N
nomor th.
Gagasan dari program ini adalah untuk menempatkan setiap elemen dari urutan dalam antrian pada suara ketiga, dan untuk mengurangi kepala antrian itu di setiap iterasi. Saat head mencapai 0
, kami menambah nilai urutan dan menghapusnya 0
.
Sekarang masalahnya adalah Prelude menggunakan tumpukan dan bukan antrian. Jadi kita perlu menggeser tumpukan itu sedikit untuk menggunakannya seperti antrian.
v #
0v ^
(#)
Ini menyalin nilai urutan saat ini ke suara pertama (sebagai salinan sementara), mendorong a 0
ke suara kedua (untuk menandai akhir antrian). Dan kemudian melakukan loop untuk menggeser (dan dengan demikian membalikkan) tumpukan ketiga ke tumpukan kedua. Setelah loop, kami meletakkan salinan nilai urutan saat ini di atas tumpukan kedua (yang merupakan ekor dari antrian kami).
)
(#
^#1-
Ini terlihat agak jelek, tetapi pada dasarnya itu adalah loop yang menggeser tumpukan kembali ke suara ketiga. Karena )
berada di kolom yang sama dengan instruksi pemindahan gigi, 0
kita menempatkan suara kedua sebelumnya juga akan berakhir pada suara ketiga, jadi kita harus menghapusnya dengan yang lain #
. Kemudian kurangi bagian atas suara ke-3, yaitu kepala antrian.
Sekarang jadi sedikit menjengkelkan - kami ingin menjalankan beberapa kode ketika nilainya 0
, tetapi satu-satunya struktur kontrol Prelude (loop) hanya merespon nilai-nilai yang tidak nol.
0 (1+0)#
(0)#
Perhatikan bahwa bagian atas suara kedua adalah benar (karena urutan Golomb tidak mengandung 0
s). Jadi beban kerja masuk ke suara itu (sepasang kurung terakhir). Kita hanya perlu mencegah hal itu terjadi jika kepala antrian 0
belum. Jadi pertama-tama kita memiliki "loop" pada suara ketiga yang mendorong a 0
ke suara kedua jika kepala antrian masih nol. Kami juga menggunakan 0
suara ketiga untuk segera keluar dari loop. The #
pada suara ketiga maka baik menghapus yang 0
, atau menghilangkan kepala antrian jika itu sudah nol. Sekarang loop kedua hanya dimasukkan jika kepala antrian adalah nol (dan0
pada suara kedua tidak pernah didorong). Dalam hal ini kami menambah nilai saat ini dari urutan dan mendorong 0
untuk keluar dari loop. Terakhir, akan selalu ada 0
tumpukan di atas, yang harus kita buang.
Saya katakan bahwa negasi logis mengganggu di Prelude ...
n
alih-alih2 - n % 1
. Apakah Anda punya alasan untuk mengharapkan jawaban berbeda secara signifikan?