Recamáns Duplikate


14

Recamáns Sequenz ist wie folgt definiert:

einn={0wenn n = 0einn-1-nwenn einn-1-n>0 und ist nicht schon in der Reihenfolge,einn-1+nAndernfalls

oder in Pseudocode:

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. 

Die ersten Nummern lauten ( 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

Wenn Sie diese Sequenz studieren, werden Sie feststellen, dass es beispielsweise Duplikate gibt a(20) = a(24) = 42(0-indiziert). Wir nennen eine Nummer ein Duplikat, wenn sich in der Sequenz mindestens eine identische Nummer davor befindet.


Herausforderung:

Nehmen Sie eine Ganzzahleingabe k und geben Sie entweder die ersten k doppelten Zahlen in der Reihenfolge aus, in der sie als Duplikate in Recamáns Sequenz gefunden wurden, oder nur die k -te Zahl.

Diese ersten doppelten Zahlen sind:

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

Ein paar Dinge zu beachten:

  • a (n) zählt nicht als Duplikat, wenn in keine identischen Zahlen enthalten sind a (0) ... a (n-1) , auch wenn a (n + m) == a (n) .
  • 42 steht vor 43, da das Duplikat vor dem Duplikat von 43 auftritt
  • Die Reihenfolge ist nicht sortiert
  • Auch in dieser Sequenz gibt es doppelte Elemente. Zum Beispiel sind sowohl die 12. als auch die 23. Ziffer 262 (0-indiziert).

Testfälle (0-indiziert)

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

Das ist , also gewinnt der kürzeste Code in jeder Sprache!

Erklärungen sind erwünscht!



Warum wird 43vorher nichts ausgegeben 42? Es erscheint zuerst in Recamáns Sequenz. Meinen Sie damit zuerst die Ausgabe, die zuerst als Duplikat erkannt wurde?
Luis Mendo

1
43424243

Ich habe auch die beliebte math.SE-Frage kürzlich gesehen: P
Orlp

@orlp huh? Können Sie darauf verlinken? Ich habe es nicht gesehen ...
Stewie Griffin

Antworten:


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

Probieren Sie es online!

1-indiziert.

Erläuterung

For[

For Schleife.

i=k=j=p=0

i={ein1,ein2,}kj=np=einn-1

k<#

Wiederholen, solange kweniger als die Eingabe ist.

i=i|p

Anfügen pan imit dem Kopf Alternatives(a Golfier Version Listin diesem Fall).

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

jpjeinn-1>np-jieinn-1-n ist neu), dann inkrementiere pum -j. Andernfalls erhöhen Sie pum j.

i~FreeQ~p||k++

Jede Iteration inkrementieren k wenn pnicht in i(die ||(= or) Kurzschlüsse sonst).

... ;p

Return p.





2

JavaScript (ES6), 66 59 Bytes

Gibt den N-ten Term mit dem Index 0 zurück.

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

Probieren Sie es online!

Wie?

Wir verwenden g () als unsere rekursive Hauptfunktion und als Objekt, um die Duplikate zu verfolgen.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.