Angka tersegmentasi

15

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
Posting Rock Garf Hunter
sumber

Jawaban:

12

Haskell, 62 58 byte

-4 byte terima kasih kepada @xnor!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

Urutan 0-diindeks.

ThreeFx
sumber
1
Saya pikir Anda perlu dua byte lagi dan mengelilingi baris terakhir dengan ()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.
nimi
1
Metode yang indah! Impor tampaknya seperti berlebihan; filter(`notElem`scanl(+)x z)yharus dilakukan.
xnor
7

Perl, 50 49 byte

Termasuk +1 untuk -p

Jalankan dengan input pada STDIN:

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

Penjelasan

@Fberisi 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, 1secara otomatis akan menjadi nomor pertama.

Karena ukuran @Fadalah berapa banyak angka yang telah dihasilkan, dapat digunakan sebagai kondisi penghentian

Ton Hospel
sumber
4

05AB1E , 17 16 byte

Xˆ$µ>D¯ŒOså_i¼Dˆ

Penjelasan

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

Cobalah online!

Disimpan 1 byte berkat Adnan

Emigna
sumber
Apakah $alih-alih Xsbekerja?
Adnan
@ Adnan: Ya tentu saja. Bodoh bagiku. Terima kasih!
Emigna
4

Jelly , 14 13 11 byte

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Cobalah online!

Bagaimana itu bekerja

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.
Dennis
sumber
2

Pyth - 19 17 byte

Sialan satu per satu menghancurkan semua implisit saya. (Byte sama menghitung, literaly incrementing Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Test Suite .

Maltysen
sumber
Menggunakan pengurangan simpanan (hanya) satu byte. Diharapkan lebih ...eu+Gf!}TsM.:G))hQY
Jakube
1
@Jakube map biasanya lebih pendek untuk urutan referensial diri seperti ini
Maltysen
2

Javascript, 125 112 110 byte

Disimpan 2 byte berkat @Neil

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

Jawaban sebelumnya

112 byte berkat @Neil:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 byte:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}
Hedi
sumber
1
Karena 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 membutuhkan k?
Neil
1
Sekarang karena Anda if(!...){...}hanya satu pernyataan, Anda mungkin bisa menggantinya dengan ...||(...)atau ...?0:....
Neil
1

Python, 113 105 92 80 byte

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

Byte terakhir yang saya selamatkan terinspirasi oleh jawaban Ton's Perl: saya Fmelakukan hal yang sama seperti miliknya @F; saya spada dasarnya melakukan hal yang sama seperti miliknya %::.

Lynn
sumber
1

JavaScript (ES6), 77 byte

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

Pada dasarnya port rekursif dari algoritma jawaban Perl @ TonHospel.

Neil
sumber