Los duplicados de Recamán


14

La secuencia de Recamán se define de la siguiente manera:

unnorte={0 0si n = 0unnorte-1-norteSi unnorte-1-norte>0 0 y no está ya en la secuencia,unnorte-1+nortede otra manera

o en seudocó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. 

Los primeros números son ( 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

Si estudia esta secuencia, notará que hay duplicados, por ejemplo a(20) = a(24) = 42(0 indexados). Llamaremos a un número un duplicado si hay al menos un número idéntico delante de él en la secuencia.


Desafío:

Tome una entrada entera k , y genere los primeros k números duplicados en el orden en que se encuentran como duplicados en la secuencia de Recamán, o solo el número k '.

Estos primeros números duplicados son:

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

Algunas cosas a tener en cuenta:

  • a (n) no cuenta como duplicado si no hay números idénticos en a (0) ... a (n-1) , incluso si a (n + m) == a (n) .
  • 42 será antes de 43, ya que su duplicado ocurre antes del duplicado de 43
  • La secuencia no está ordenada.
  • También hay elementos duplicados en esta secuencia. Por ejemplo, los números 12 y 23 son 262 (indexados en 0).

Casos de prueba (0 indexados)

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

Este es el , por lo que gana el código más corto en cada idioma.

¡Se alientan las explicaciones!



¿Por qué no se 43emite antes 42? Aparece primero en la secuencia de Recamán. ¿Te refieres a la salida primero, la primera que se encuentra duplicada?
Luis Mendo

1
43424243

También, vi la pregunta popular de matemáticas recientemente: P
orlp

@orlp ¿eh? ¿Puedes vincularlo? No lo he visto ...
Stewie Griffin

Respuestas:


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

Pruébalo en línea!

1 indexado.

Explicación

For[

For lazo.

i=k=j=p=0

Empezar con i (={un1,un2,...}), k(número de duplicados encontrados), j(=norte), p(=unnorte-1) igual a 0.

k<#

Repita mientras ksea ​​menor que la entrada.

i=i|p

Anexar pa iusar la cabeza Alternatives(una versión Golfier de Listen este caso).

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

Incremento j. Si pes mayor que j(es decirunnorte-1>norte) y p-jno está en i(es decirunnorte-1-nortees nuevo), luego incremente pen -j. De lo contrario, incremente pen j.

i~FreeQ~p||k++

Cada iteración, incremente ksi pno está en i(los ||(= or) cortocircuitos de lo contrario).

... ;p

Retorno p.





2

JavaScript (ES6), 66 59 bytes

Devuelve el enésimo término, indexado a 0.

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

Pruébalo en línea!

¿Cómo?

Usamos g () como nuestra principal función recursiva y como un objeto para realizar un seguimiento de los duplicados.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.