Pertimbangkan urutan berikut:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Terlihat cantik tanpa pola, kan? Begini cara kerjanya. Mulai dengan 0
, lompat n
bilangan bulat, dengan n
mulai dari 1
. Itu nomor berikutnya dalam urutan. Kemudian, tambahkan angka "dilewati" dan itu belum terlihat dalam urutan menaik. Kemudian, kenaikan n
dan lompat dari nomor terakhir ditambahkan. Ulangi pola ini.
Jadi, misalnya, ketika kami mencapai 11
, kami berada di n=5
. Kami naik n
menjadi n=6
, melompat ke atas 17
, lalu menambahkan 13 14 15 16
karena itu belum terlihat. Lompatan kita berikutnya adalah n=7
, jadi elemen berikutnya dalam urutannya adalah 23
.
Tantangan
Input yang diberikan x
, output x
istilah ke-5 dari urutan ini, x
persyaratan pertama dari urutan tersebut, atau membuat daftar syarat-syarat dari urutan tersebut. Anda dapat memilih pengindeksan 0 atau 1.
I / O dan Aturan
- Input dan output dapat diberikan dengan metode apa pun yang mudah .
- Input dan output dapat dianggap sesuai dengan jenis nomor asli bahasa Anda.
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
Jawaban:
JavaScript (ES7), 41 byte
Mengembalikan istilah ke-n dari urutan, 0-diindeks.
Cobalah online!
Bagaimana?
Kasus utama:n > 3
Empat istilah pertama dari urutan itu spesial, jadi mari kita kesampingkan untuk saat ini.
Untuk , urutannya terlihat seperti itu:n > 3
Kita dapat melihat bahwa sebenarnya ada dua sub-urutan yang disisipkan:
Sebagian besar nilai milik sub-urutan yang kami miliki:SEBUAH
Beberapa nilai lain milik sub-urutan (disorot dengan tanda kurung dalam diagram di atas) yang indeksnya mengikuti urutan aritmatika 3, 3, 4, 6, 9, 13, 18, 24 ... dan yang kami miliki:B
di mana adalah indeks dalam urutan utama dan k adalah indeks dalam sub-urutan B .n k B
Indeks dalam urutan utama diberikan oleh:B
Diberikan , kita tahu bahwa istilah yang sesuai dalam urutan utama milik B jika n adalah solusi integer dari persamaan kuadratik:n B n
yang diskriminan adalah:
dan yang solusi positifnya adalah:
Kami berharap menjadi bilangan bulat. Karenanya tes:Δ--√
Kasus khusus:0 ≤ n ≤ 3
Untuk , diskriminan negatif dan mengambil hasil akar kuadratnya dalam NaN . Untuk n = 3 , diskriminan adalah 1 . Oleh karena itu, ini pertama empat hal urutan dianggap milik sub-urutan B .n < 3 n = 3 1 B
Jika kita hanya menerapkan rumus standar n - ~ d / 2 , kita akan mendapatkan:
dari pada:
Itulah sebabnya kami XOR hasil ini dengan masing-masing.0 , 1 , 2 dan 1
sumber
Sekam , 12 byte
Cobalah online!
Keluaran sebagai daftar tak terbatas. Berikut adalah versi yang mencetak N pertama .
Penjelasan
sumber
Haskell , 43 byte
Cobalah online!
Menentukan daftar tanpa batas:
sumber
Jelly , 15 byte
Ini adalah program lengkap yang, mengingat n , mencetak n item pertama dari urutan.
Cobalah online!
Bagaimana itu bekerja
sumber
C (gcc),
736764 byteCobalah online!
Menentukan fungsi
f
yang mengambil 0-diindeksn
dan menghasilkann
nomor th dalam urutan.Kita dapat menganalisis urutan sebagai berikut:
Pertama kita menangani bagian tengah:
Perhatikan bahwa argumen di sebelah kiri (4, 6, 9, 13, ...) mengikuti pola: pertama tambahkan dua, lalu tambahkan tiga, lalu tambahkan empat, dan seterusnya. Kami mulai
t=4
dan menambahkand
(yang dimulai pada 2) setiap iterasi dari loop, bertambahd
dalam proses.Tubuh loop lebih menarik. Ingatlah bahwa kami ingin memetakan 4 hingga 5, 6 hingga 8, 9 hingga 12, dll .; itu hanya menambahkan
d-1
jikax
adat
. Namun, logika ini muncul sebelum kasus terakhirf(n) = n - 1
,, jadi kami tahu kami akan mengurangi 1 di akhir. Karena itu, kita cukup menambahkand
ifx == t
(x-t||(x+=d)
). Namun, kita juga perlu untuk keluar dari loop segera setelah ini - jadi kita tambahkan bahwa untukd
mendapatkan absurd-carid+=x+=d
, yang akan selalu membuatd<x
kondisi gagal.Ini mencakup semuanya kecuali untuk empat nilai pertama. Melihat mereka dalam biner, kita mendapatkan:
Jadi, kami ingin membalik bit terakhir jika
2 <= x < 4
. Ini dipenuhi denganx^x/2
.x/2
memberikan bit paling signifikan kedua, jadi XORing ini dengan nomor asli membalik bit terakhir jika jumlahnya 2 atau 3.sumber
Jelly ,
1310 byte-3 Terima kasih kepada Dennis (gunakan pengindeksan 0 untuk menyimpan 2 dari pengaturan jumlah kumulatif dan penurunan akhir)
Tautan monadik yang menerima integer, 0 -indexed n , yang mengembalikan integer, a (n)
Cobalah online! Atau lihat test-suite
sumber
ḶÄ+3i+’
, tetapi tidak tahu bagaimana menangani kasus tepi.Ḷ»ạ¥3
untukḊ3,2;
- terasa seperti harus ada terser untuk sedikit ini.Ḷ»2Äi+_>2$
menghemat 3 byte, dengan pengindeksan berbasis 0.Perl 5 dengan
-pl
, 70 byteCobalah online!
sumber
MATL , 22 byte
Menghasilkan
n
istilah pertama dari urutan.Cobalah online!
Penjelasan
sumber
Haskell , 51 byte
Cobalah online!
Agak lebih lama dari jawaban Lynn's Haskell , tetapi pendekatan yang berbeda mungkin menarik.
sumber
Ruby , 73 byte
Cobalah online!
Fungsi rekursif yang mengembalikan x angka pertama dari daftar.
sumber
QBasic, 58 byte
Output tanpa batas. Anda mungkin ingin menambahkan
SLEEP 1
di dalam lingkaran atau membuatnyaLOOP WHILE b<100
atau sesuatu seperti itu untuk melihat hasilnya.Ini pada dasarnya hanya mengimplementasikan spek. Perhatikan bahwa angka yang kita kembalikan akan selalu berupa angka antara angka yang melompat-baru dan angka yang melompat-ke sebelum itu. Jadi kami menyimpan batasan-batasan ini sebagai
a
danb
dan menggunakanFOR
lingkaran untuk mencetak semua angka di antara mereka.sumber
05AB1E , 14 byte
Cobalah online!
sumber
R , 70 byte
Cobalah online!
F
konstan berkat saran @JADsetdiff
sebagai gantinyax[x %in% y]
Versi sebelumnya (79 byte)
sumber
5 bytes
dan menyebabkan banyak peringatan!F/T
tidak didefinisikan ulang pada definisi fungsi. Itu tidak (IIRC) mengubah nilai global untukF/T
Python 2 , 123 byte
Cobalah online!
Diberikan input x, output x syarat pertama dari urutan,
Saya belajar Python dan tantangan ini membuat segalanya lebih menarik.
Sunting: mencukur spasi
sumber
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Jelly , 16 byte
Cobalah online!
Satu byte lebih lama dari jawaban Jelly yang sudah ada tetapi ini mungkin bisa sedikit golf.
RÄṬŻk²Ḋ$
mungkin bisa lebih pendek.18 byte
Lebih lama tetapi berbeda.
sumber
Ruby , 63 byte
Cobalah online!
Diindeks 0. Mungkin bisa bermain golf.
sumber
Perl 6 , 52 byte
Cobalah online!
Ini adalah ekspresi generator menggunakan
...
operator. Ia mencari celah dalam urutan sebelumnya@_
melalui((^max @_)∖@_).min.?key
:The
?
diperlukan untuk nilai awal yang tidak memiliki.key
. Jika tidak ada celah yang ditemukan, maka ia menambahkan n (di sini dalam$
variabel) ke nilai terakhir dalam daftar, ditambah satu untuk mati oleh 0 kesalahan.sumber
Python 3 , 104 byte
Cobalah online!
Diberikan input x, output x "urutan" pertama
sumber