Số phân đoạn


15

Chuỗi các số được phân đoạn hoặc số nguyên tố đo ( OEIS A002048 ) là dãy số sao cho mỗi thành viên là số dương nhỏ nhất (lớn hơn 0) không thể tạo thành tổng của các số liên tiếp trước đó, với a(0) = 1.

Thí dụ

Để tính toán a(7)trước tiên chúng ta tính toán a(0->6) = [1, 2, 4, 5, 8, 10, 14]. sau đó chúng tôi bắt đầu từ số 0 và đi qua các số cho đến khi chúng tôi tìm thấy một số không phải là tổng của một hoặc nhiều số liên tiếp trong chuỗi.

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 = ????

Vì mười lăm không thể được thực hiện bằng cách tính tổng bất kỳ chuỗi liên tiếp nào và mỗi số nhỏ hơn có thể là mười lăm là số tiếp theo trong chuỗi. a(7) = 15

Bài tập

Nhiệm vụ của bạn là lấy một số (thông qua các phương thức tiêu chuẩn) và xuất ra số hạng thứ n trong chuỗi này (thông qua các phương thức đầu ra tiêu chuẩn). Đây là môn đánh gôn và bạn sẽ được ghi điểm như vậy.

Các trường hợp thử nghiệm

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

Câu trả lời:


12

Haskell, 62 58 byte

-4 byte nhờ @xnor!

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

Trình tự là 0 chỉ mục.


1
Tôi nghĩ rằng bạn cần thêm hai byte và bao quanh dòng cuối cùng ()để làm cho nó hoạt động đúng. Phần được áp dụng !!là một phần toán tử và phải được đặt trong ()để làm cho nó trở thành một hàm. Không có nó chỉ là một đoạn mã chỉ trở thành một hàm (hoặc "giá trị" để sử dụng các thuật ngữ Haskell nghiêm ngặt) với đối số bị thiếu.
nimi

1
Phương pháp đẹp! Việc nhập khẩu có vẻ như quá mức cần thiết; filter(`notElem`scanl(+)x z)ynên làm.
xnor

7

Perl, 50 49 byte

Bao gồm +1 cho -p

Chạy với đầu vào trên STDIN:

segmented.pl <<< 7

segmented.pl:

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

Giải trình

@Fchứa danh sách các tổng (âm) của các số liên tiếp kết thúc bằng số cuối cùng hiện tại. Khi một số mới được phát hiện, danh sách được mở rộng bằng 0 và sau đó tất cả các giá trị được giảm bởi số mới duy trì bất biến.

Toàn cầu %::được sử dụng như một ánh xạ băm tất cả các số (âm) đã được nhìn thấy (thông qua @F) thành một giá trị khác không.

$\là số hiện tại và được tăng cho đến khi nó đạt đến một giá trị chưa có %::.

Bằng cách cẩn thận một chút về thứ tự xảy ra, không cần khởi tạo, 1sẽ tự động trở thành số đầu tiên.

Vì kích thước @Flà bao nhiêu số đã được tạo nên nó có thể được sử dụng làm điều kiện tạm dừng


4

05AB1E , 17 16 byte

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

Giải trình

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

Hãy thử trực tuyến!

Đã lưu 1 byte nhờ Adnan


Có phải $thay vì Xslàm việc?
Ad Nam

@Ad Nam: Vâng tất nhiên. Sự ngớ ngẩn của tôi. Cảm ơn!
Emigna

4

Thạch , 14 13 11 byte

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ḷ߀Ẇ;ḅ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.

2

Pyth - 19 17 byte

Chết tiệt - bởi một người phá hỏng tất cả những ẩn ý của tôi. (Tương tự byte đếm, literaly incrementing Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Phòng thử nghiệm .


Sử dụng giảm tiết kiệm (chỉ) một byte. Dự kiến ​​nhiều hơn ...eu+Gf!}TsM.:G))hQY
Jakube

1
Bản đồ @Jakube thường ngắn hơn cho các chuỗi tự tham chiếu như thế này
Maltysen

2

Javascript, 125 112 110 byte

Đã lưu 2 byte nhờ @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)}

Câu trả lời trước

112 byte nhờ @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)}

1
Đối với b.every(c=>c-i), tôi sẽ thử !b.includes(i)hoặc có thể !a.some(b=>b.includes(i))làm việc, trong khi [0,...a[k]||[]].map(v=>i+v)có thể thay thế [i].concat((a[k]||[]).map(v=>i+v)). Ngoài ra bạn có thực sự cần k?
Neil

1
Bây giờ bạn if(!...){...}chỉ là một tuyên bố, bạn có thể thay thế nó bằng ...||(...)hoặc ...?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

Các byte cuối cùng tôi lưu được lấy cảm hứng từ câu trả lời Perl của Ton: tôi Flàm điều tương tự như của anh ấy @F; của tôi svề cơ bản giống như của anh ấy %::.


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

Về cơ bản là một cổng đệ quy của thuật toán trả lời Perl của @ TonHosp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.