Urutan angka tersegmentasi atau bilangan prima pengukuran ( OEIS A002048 ) adalah urutan angka sehingga setiap anggota adalah angka positif terkecil (lebih besar dari nol) yang tidak dapat dibuat dari jumlah angka berurutan sebelumnya, dengan a(0) = 1
.
Contoh
Untuk menghitung, a(7)
pertama-tama kita menghitung a(0->6) = [1, 2, 4, 5, 8, 10, 14]
. kita kemudian mulai dari nol dan melalui angka sampai kita menemukan satu yang bukan jumlah dari satu atau lebih angka berurutan dalam urutan.
1 = 1
2 = 2
3 = 1 + 2
4 = 4
5 = 5
6 = 2 + 4
7 = 1 + 2 + 4
8 = 8
9 = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????
Karena lima belas tidak dapat dibuat dengan menjumlahkan urutan berikutnya dan setiap angka yang lebih kecil dapat menjadi lima belas adalah angka berikutnya dalam urutan. a(7) = 15
Tugas
Tugas Anda adalah mengambil nomor (melalui metode standar) dan menampilkan istilah ke-n dalam urutan ini (melalui metode keluaran standar). Ini adalah kode-golf dan Anda akan mendapat nilai seperti itu.
Uji Kasus
0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
()
untuk membuatnya berfungsi. Parsial yang diterapkan!!
adalah bagian operator dan harus disertakan()
untuk membuatnya berfungsi. Tanpa itu hanya potongan yang hanya menjadi fungsi (atau "nilai" untuk menggunakan istilah Haskell yang ketat) dengan argumen yang hilang.filter(`notElem`scanl(+)x z)y
harus dilakukan.Perl,
5049 byteTermasuk +1 untuk
-p
Jalankan dengan input pada STDIN:
segmented.pl
:Penjelasan
@F
berisi daftar (negatif) jumlah angka berurutan yang diakhiri dengan angka terakhir saat ini. Ketika nomor baru ditemukan daftar diperpanjang dengan 0 dan kemudian semua nilai diturunkan oleh nomor baru yang mempertahankan invarian.Global
%::
digunakan sebagai pemetaan hash semua angka (negatif) yang telah dilihat (sampai@F
) ke nilai yang bukan nol.$\
adalah angka saat ini dan bertambah hingga mencapai nilai yang belum%::
.Dengan sedikit berhati-hati tentang urutan di mana semuanya terjadi tanpa inisialisasi diperlukan,
1
secara otomatis akan menjadi nomor pertama.Karena ukuran
@F
adalah berapa banyak angka yang telah dihasilkan, dapat digunakan sebagai kondisi penghentiansumber
05AB1E ,
1716 bytePenjelasan
Cobalah online!
Disimpan 1 byte berkat Adnan
sumber
$
alih-alihXs
bekerja?Jelly ,
141311 byteCobalah online!
Bagaimana itu bekerja
sumber
Pyth -
1917 byteSialan satu per satu menghancurkan semua implisit saya. (Byte sama menghitung, literaly incrementing
Q
:=hQesmaYf!}TsM.:Y
)Test Suite .
sumber
eu+Gf!}TsM.:G))hQY
Javascript,
125112110 byteDisimpan 2 byte berkat @Neil
Jawaban sebelumnya
112 byte berkat @Neil:
125 byte:
sumber
b.every(c=>c-i)
, saya akan mencoba!b.includes(i)
atau mungkin!a.some(b=>b.includes(i))
bekerja, sementara[0,...a[k]||[]].map(v=>i+v)
mungkin akan menggantikan[i].concat((a[k]||[]).map(v=>i+v))
. Apakah Anda benar-benar membutuhkank
?if(!...){...}
hanya satu pernyataan, Anda mungkin bisa menggantinya dengan...||(...)
atau...?0:...
.Python,
1131059280 byteByte terakhir yang saya selamatkan terinspirasi oleh jawaban Ton's Perl: saya
F
melakukan hal yang sama seperti miliknya@F
; sayas
pada dasarnya melakukan hal yang sama seperti miliknya%::
.sumber
JavaScript (ES6), 77 byte
Pada dasarnya port rekursif dari algoritma jawaban Perl @ TonHospel.
sumber