Kami mulai dengan urutan kosong 1-diindeks:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
Pada langkah ke- n , kita mengisi setiap a (n) kosong dengan bilangan bulat lebih besar dari 1 mulai dari sisa kosong pertama, di mana a (n) adalah entri ke- n dalam urutan.
Setelah langkah pertama:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Perhatikan bahwa (1) harus 2 karena bilangan bulat pertama lebih besar dari 1 adalah 2.
Pada langkah kedua, kami mengisi setiap (2) kosong. Jelas bahwa a (2) harus 2.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
Pada langkah ketiga, kami mengisi setiap a (3) kosong. Dari urutan, a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
Pada langkah keempat, kami mengisi setiap a (4) kosong. Dari urutan, a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Akhirnya:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Tugas
Diberikan n, kembalikan elemen ke- n dari urutan.
10.000.000 syarat pertama dari urutan dapat ditemukan di sini .
Ini adalah kode-golf . Jawaban terpendek dalam byte menang. Celah standar berlaku.
Jawaban:
Haskell ,
8067 byteCobalah online!
Haskell adalah bahasa yang sempurna untuk mendefinisikan daftar yang tak terbatas dalam hal dirinya sendiri.
sumber
let
penjaga pola.pattern1 | let pattern2 = expr2 = expr1
berarti hal yang sama denganpattern1 = let pattern2 = expr2 in expr1
(untuk alasan yang sama yang[expr1 | let pattern2 = expr2]
berarti hal yang sama dengan[let pattern2 = expr2 in expr1]
).let
penjaga pola (terutama mereka dapat melakukan fungsi)! Juga,m=2:2:2`drop`g m
satu byte lebih pendek.(!!)$0:m
lebih pendek dua byte.2:2:
barang sepenuhnya dengan sedikit lebih malas:g ~(a:b)|...
danm=g m
.C, 123 byte
Cobalah online!
Panduan
Mengalokasikan array n bilangan bulat untuk menyimpan pertama n unsur urutan. Ini
sizeof(int)
sebagai4
kode hard , yang merupakan asumsi yang aman dalam banyak kasus dan tentu saja saya bersedia membuat dalam konteks kode golf. :)Ini semua adalah penghitung:
i
untuk indeks langkah kita,j
untuk mengulangi urutan mencari ruang kosong, dank
untuk menghitung berapa banyak ruang kosong telah terlihat.Sebelum kita memulai loop utama, kita menyelinap dalam inisialisasi dua elemen pertama dari urutan
2
. (p[0]
=*(p + 0)
=*p
.) Meskipun demikian, ini tidak masuk hitungank
, tapi ...... kami juga melakukan inisialisasi licik dari
k
, yang menguji untuk melihat apakahi
kurang dari2
dan mengoreksi nilai awalk
jika demikian. Loop dalam juga dimulai di sini, yang mengulangi seluruh urutan sejauh ini pada setiap langkah.Baris ini benar-benar bisa menggunakan beberapa penjelasan. Kami dapat memperluas ini ke:
oleh hubungan arus pendek, dan kemudian oleh hukum De Morgan dan fakta yang
0
salah dalam C:Ini pada dasarnya menyatakan: "jika ruang ini kosong, kenaikan
k
. Dan jikak
sebelumnya merupakan kelipatan dari ukuran langkah, jalankan pernyataan berikut." Oleh karena itu, kami menjalankan pernyataan pada setiap elemen ukuran langkah , yang persis bagaimana urutannya dijelaskan. Pernyataan itu sendiri sederhana; semua itu adalah menghasilkan2
,3
,4
, ....Menggunakan tricky-return-without-a-return yang bekerja dengan
gcc
, kita "mengembalikan" elemen terakhir dari n istilah pertama dalam urutan, yang kebetulan merupakan istilah ke- n .sumber
Pyth, 29 byte
Cobalah online
Bagaimana itu bekerja
Alih-alih bermain-main dengan daftar, ini menggunakan formula rekursif polos.
sumber
Haskell , 67 byte
Cobalah online!
Solusi aritmatika rekursif yang ternyata pada dasarnya metode yang sama dengan jawaban Pyth Anders Kaseorg .
Kode ini tercakup dalam kutil - bagian jelek yang kelihatannya bisa di-golf, tapi saya tidak mengerti caranya.
Fungsi ini
i%j
benar-benar ingin menggunakan penjaga untuk memeriksa apakahmod i(f j)>0
dan mengevaluasi salah satu dari dua ekspresi yang sesuai. Namun, kedua ekspresi tersebut digunakandiv i(f j)
. Mengikatnya di penjaga tidak akan membuatnya berlaku untuk kedua sisi. Sejauh yang saya tahu, seorang penjaga tidak dapat dibuat untuk "mendistribusikan" penjaga lainnya.let
danwhere
terlalu panjang. Jadi, kode tersebut digunakanlast
untuk memilih satu dari dua ekspresi sementara penjaga mengikat variabel. Ugh.Idealnya kami akan menggunakan
divMod
karena keduanyadiv
danmod
digunakan, tetapi(d,m)<-divMod ...
adalah ekspresi yang panjang. Kami bukannya memeriksa mod mod bukan nol dengan melihat apakahdiv
nilai kali pembagi kurang dari nilai aslinya.The
0%j=2
kasus tidak akan diperlukan jika Haskell hubung pendekdiv 0
, yang tidak. The.pred
bertobat 1-diindeks masukan ke nol-diindeks, atau yang lain akan ada-1
koreksi di mana-mana.sumber
%
1-diindeks, maka Anda perlu koreksi lima byte - yang hanya mengikat. Namun , Anda kemudian dapatf
masuk%
tanpa biaya, dan kemudianf
menjadi anonim sehingga Anda menyimpan dua byte secara keseluruhan.f
tanpa kehilangan byte.divMod
tampaknya satu byte lebih murah, karena memungkinkan percabangan dengan!!(0^m)
. Sejauh ini saya punya:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 byteFungsi rekursif yang berhenti segera setelah hasilnya tersedia.
Versi alternatif, 90 byte
Disarankan oleh Shaggy untuk -1 byte
Yang ini harus dipanggil dengan
f(n)()
. Meskipun pos terkait dalam meta saat ini memberikan skor positif, sintaksis ini tampaknya disengketakan.Demo
Tampilkan cuplikan kode
sumber
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
harus bekerja untuk 92 byte. Sebut saja denganf(n)()
.Java 8, 124 byte
Ekspresi lambda.
Membuat array integer dan terus-menerus mengisinya sampai nilai n terisi.
Pra-deklarasi variabel di atas untuk mengurangi sebanyak mungkin deklarasi karena masing-masing
int
biaya 4 byte ruang dibandingkan dengan menambahkan,n
yang 2.Pada
j
'iterasi perhitungan, jumlah' kosong 'yang harus dilewati adalah sama dengana[j]
(atau 2, jika kosong). Ternyata jika ruang kosong pertama yang harus kita isi ada di posisik
,k * a[j]
beri kami 'langkah' (s
).sumber