Recamán的重复项


14

Recamán的顺序定义如下:

一种ñ={0如果n = 0一种ñ-1个-ñ如果 一种ñ-1个-ñ>0 并且尚未在序列中一种ñ-1个+ñ除此以外

或使用伪代码:

a(0) = 0,
if (a(n - 1) - n) > 0 and it is not 
   already included in the sequence,
     a(n) = a(n - 1) - n 
else 
     a(n) = a(n - 1) + n. 

第一个数字是(OEIS A005132):

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 25, 43, 62, 42, 63, 41, 18, 42

如果研究此序列,您会发现其中存在重复项,例如a(20) = a(24) = 42(0索引)。如果序列中前面至少有一个相同的数字,我们将其称为重复数字。


挑战:

取整数输入k,然后输出前k个重复数字(按在Recamán序列中被发现重复的顺序)或仅输出第k个数字。

这第一个重复的数字是:

42, 43, 78, 79, 153, 154, 155, 156, 157, 152, 265, 261, 262, 135, 136, 269, 453, 454, 257, 258, 259, 260, 261, 262

注意事项:

  • 如果a(0)... a(n-1)中没有相同的数字,即使a(n + m)== a(n),a(n)也不会算作重复项。
  • 42将在43之前,因为其重复出现在43的重复之前
  • 序列未排序
  • 此序列中也有重复的元素。例如,第12号和第23号都是262(0索引)。

测试用例(0索引)

k      Output
    0      42
    9     152
   12     262
   23     262
  944    5197
  945   10023
10000   62114

这是,因此每种语言中最短的代码胜出!

鼓励解释!



为什么43以前不输出42?它首先出现在Recamán的序列中。您是说首先输出一个首先被发现是重复的输出吗?
Luis Mendo

1
43424243

我也看到了最近流行的math.SE问题:P
orlp

@orlp是吗?您可以链接到它吗?我还没看过……
Stewie Griffin

Answers:


5

Wolfram语言(Mathematica)88 85 76字节

(For[i=k=j=p=0,k<#,i~FreeQ~p||k++,i=i|p;p+=If[p>++j&&FreeQ[i,p-j],-j,j]];p)&

在线尝试!

1个索引。

说明

For[

For 环。

i=k=j=p=0

i={一种1个一种2}kj=ñp=一种ñ-1个

k<#

重复的时间k小于输入的时间。

i=i|p

追加pi用头Alternatives(的golfier版本List在这种情况下)。

p+=If[p>++j&&FreeQ[i,p-j],-j,j]

jpj一种ñ-1个>ñ),p-j并且不在i(即一种ñ-1个-ñ是新的),那么增加p-j。否则,递增pj

i~FreeQ~p||k++

每次迭代,k如果p不在则增加i(否则||(= or)短路)。

... ;p

返回p





2

JavaScript(ES6),66 59字节

返回 0个索引的第N个项。

i=>(g=x=>!g[x+=x>n&!g[x-n]?-n:n]||i--?g(g[n++,x]=x):x)(n=0)

在线尝试!

怎么样?

我们将g()用作主要的递归函数,并将其用作跟踪重复项的对象。

i => (                    // given i
  g = x =>                // g = recursive function and generic object
    !g[x +=               // update x:
      x > n & !g[x - n] ? //   if x is greater than n and x - n was not visited so far:
        -n                //     subtract n from x
      :                   //   else:
        n                 //     add n to x
    ]                     // if x is not a duplicate
    || i-- ?              // or x is a duplicate but not the one we're looking for:
      g(g[n++, x] = x)    //   increment n, mark x as visited and do a recursive call
    :                     // else:
      x                   //   stop recursion and return x
)(n = 0)                  // initial call to g() with n = x = 0

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.