分段数


15

分段数字或质数测量的序列(OEIS A002048)是这样的数字序列,即每个成员都是最小的正数(大于零),不能由较早的连续数字之和加上a(0) = 1

为了计算,a(7)我们首先计算a(0->6) = [1, 2, 4, 5, 8, 10, 14]。然后,我们从零开始遍历数字,直到找到一个不是序列中一个或多个连续数字之和的数字。

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

由于不能通过对任何连续的子序列求和而得出15,因此每个较小的数字可以是15,这是序列中的下一个数字。 a(7) = 15

任务

您的任务是取一个数字(通过标准方法)并按此顺序输出第n个项(通过标准输出方法)。这是代码高尔夫球,您将因此而得分。

测试用例

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

Answers:


12

Haskell,62 58字节

-4个字节感谢@xnor!

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

序列从0开始索引。


1
我认为您还需要两个字节,并在最后一行周围加上()以使其正常工作。所应用的部分!!是运算符部分,必须将其括起来()才能使其起作用。没有它,仅是一个片段,只是缺少参数的一个函数(或使用严格的Haskell术语的“值”)。
nimi

1
漂亮的方法!但是,导入似乎有点过分了。filter(`notElem`scanl(+)x z)y应该做。
xnor

7

Perl,50个 49字节

包括+1的 -p

使用STDIN上的输入运行:

segmented.pl <<< 7

segmented.pl

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

说明

@F包含以当前最后一个数字结尾的连续数字(负)和的列表。当发现一个新数字时,列表将扩展为0,然后所有值都将通过新数字减少而保持不变。

全局%::用作哈希,将(通过@F)看到的所有(负)数字映射为非零值。

$\是当前数字,并增加直到达到尚未输入的值%::

稍微注意所有事情的发生顺序就不需要初始化,1它将自动成为第一个数字。

由于的大小@F是生成多少个数字,因此可以用作暂停条件


4

05AB1E17 16 字节

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

说明

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

在线尝试!

感谢Adnan,节省了1个字节


难道$不是Xs工作?
阿德南

@Adnan:当然可以。我真傻 谢谢!
Emigna'9

4

果冻14 13 11 字节

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

在线尝试!

怎么运行的

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

一个该死的毁了我所有的隐性。(同字节计数,literaly递增Q=hQesmaYf!}TsM.:Y

esmaYf!}TsM.:Y)1h

测试套件


使用减少保存(仅)一个字节。期待更多...eu+Gf!}TsM.:G))hQY
Jakube

1
对于这样的自我参照序列,@ Jakube映射通常更短
Maltysen

2

的Javascript,125个 112 110字节

@Neil节省了2个字节

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)}

先前的答案

@Neil,共112字节:

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个字节:

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
因为b.every(c=>c-i),我会尝试!b.includes(i)或可能会!a.some(b=>b.includes(i))工作,而[0,...a[k]||[]].map(v=>i+v)可能会替换[i].concat((a[k]||[]).map(v=>i+v))。您还真的需要k吗?
尼尔

1
既然您if(!...){...}只是一个语句,则可以将其替换为...||(...)...?0:...
尼尔

1

Python中,113 105 92 80个字节

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

我保存的最后字节是受Ton的Perl答案启发的:我F的工作与他的相同@F;我s的所作所为与他的所作所为基本相同%::


1

JavaScript(ES6),77个字节

(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

基本上是@TonHospel的Perl答案的算法的递归端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.