Duplicatas de Recamán


14

A sequência de Recamán é definida da seguinte forma:

uman={0 0se n = 0uman-1-nE se uman-1-n>0 0 e ainda não está na sequência,uman-1+nde outra forma

ou no pseudo-código:

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. 

Os primeiros números são ( 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

Se você estudar essa sequência, notará que existem duplicatas, por exemplo a(20) = a(24) = 42(indexadas em 0). Chamaremos um número de duplicado se houver pelo menos um número idêntico na frente na sequência.


Desafio:

Pegue uma entrada inteira k e produza os primeiros k números duplicados na ordem em que são encontrados como duplicados na Sequência de Recamán ou apenas o k 'ésimo número.

Estes primeiros números duplicados são:

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

Algumas coisas a serem observadas:

  • a (n) não conta como duplicado se não houver números idênticos em a (0) ... a (n-1) , mesmo que a (n + m) == a (n) .
  • 42 será anterior a 43, pois sua duplicata ocorre antes da duplicação de 43
  • A sequência não está classificada
  • Também existem elementos duplicados nesta sequência. Por exemplo, os números 12 e 23 são 262 (indexados 0).

Casos de teste (indexados 0)

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

Isso é , então o código mais curto em cada idioma vence!

As explicações são incentivadas!



Por que a 43saída não é anterior 42? Aparece primeiro na sequência de Recamán. Você quer dizer a saída primeiro da que se encontra duplicada?
Luis Mendo

1
4342.42.43

Eu também vi a popular matemática. Pergunta recentemente: P
orlp

@orlp hein? Você pode criar um link para ele? Eu não vi isso ...
Stewie Griffin

Respostas:


5

Wolfram Language (Mathematica) , 88 85 76 bytes

(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)&

Experimente online!

1 indexado.

Explicação

For[

For ciclo.

i=k=j=p=0

i={uma1,uma2,...}kj=np=uman-1

k<#

Repita enquanto kfor menor que a entrada.

i=i|p

Anexar pao iuso da cabeça Alternatives(uma versão golfista Listneste caso).

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

jpjuman-1>np-jiuman-1-np-jpj

i~FreeQ~p||k++

Cada iteração, incrementa kse pnão estiver em i(os ||(= or) curto-circuitos caso contrário).

... ;p

Retorno p.





2

JavaScript (ES6), 66 59 bytes

Retorna o nono termo, indexado a 0.

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

Experimente online!

Quão?

Usamos g () como nossa principal função recursiva e como um objeto para acompanhar as duplicatas.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.