Les doublons de Recamán


14

La séquence de Recamán est définie comme suit:

unen={0si n = 0unen-1-nsi unen-1-n>0 et n'est pas déjà dans la séquence,unen-1+nautrement

ou en pseudo-code:

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. 

Les premiers chiffres sont ( 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 vous étudiez cette séquence, vous remarquerez qu'il y a des doublons, par exemple a(20) = a(24) = 42 (indexés 0). Nous appellerons un numéro un doublon s'il y a au moins un numéro identique devant lui dans la séquence.


Défi:

Prenez une entrée entière k et sortez soit les k premiers nombres en double dans l'ordre où ils sont trouvés comme doublons dans la séquence de Recamán, soit uniquement les k « e numéro.

Ces premiers numéros dupliqués sont:

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

Quelques points à noter:

  • a (n) ne compte pas comme doublon s'il n'y a pas de nombres identiques dans a (0) ... a (n-1) , même si a (n + m) == a (n) .
  • 42 sera avant 43, car son double se produit avant le double de 43
  • La séquence n'est pas triée
  • Il y a aussi des éléments en double dans cette séquence. Par exemple, les 12e et 23e chiffres sont tous deux 262 (indexés 0).

Cas de test (indexés 0)

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

C'est le , donc le code le plus court dans chaque langue gagne!

Les explications sont encouragées!



Pourquoi la 43sortie n'est-elle pas antérieure 42? Il apparaît d'abord dans la séquence de Recamán. Voulez-vous dire la sortie en premier celle qui se trouve être un doublon?
Luis Mendo

1
43424243

J'ai aussi vu récemment la populaire question math.SE: P
orlp

@orlp hein? Pouvez-vous y accéder? Je ne l'ai pas vu ...
Stewie Griffin

Réponses:


5

Wolfram Language (Mathematica) , 88 85 76 octets

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

Essayez-le en ligne!

1 indexé.

Explication

For[

For boucle.

i=k=j=p=0

i={a1,a2,}kj=np=an1

k<#

Répéter alors que kest inférieur à l'entrée.

i=i|p

Ajouter p à iutiliser la tête Alternatives(une version golfeur de Listdans ce cas).

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

jpjan1>np-jiunen-1-n est nouveau), alors incrémenter pde -j. Sinon, incrémentez pde j.

i~FreeQ~p||k++

Chaque itération, incrément k si pn'est pas dans i(les ||(= or) courts-circuits sinon).

... ;p

Revenir p .





2

JavaScript (ES6), 66 59 octets

Renvoie le Nième terme, indexé sur 0.

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

Essayez-le en ligne!

Comment?

Nous utilisons g () comme fonction récursive principale et comme objet pour garder une trace des doublons.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.