I duplicati di Recamán


14

La sequenza di Recamán è definita come segue:

un'n={0se n = 0un'n-1-nSe un'n-1-n>0 e non è già nella sequenza,un'n-1+naltrimenti

o in pseudo-codice:

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. 

I primi numeri sono ( 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 studi questa sequenza, noterai che ci sono duplicati, ad esempio a(20) = a(24) = 42(indicizzati 0). Chiameremo un numero un duplicato se nella sequenza è presente almeno un numero identico.


Sfida:

Prendi un intero k e immetti i primi k numeri duplicati nell'ordine in cui vengono trovati come duplicati nella sequenza di Recamán o solo il k 'esimo numero.

I primi numeri duplicati sono:

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

Alcune cose da notare:

  • a (n) non conta come duplicato se non ci sono numeri identici in a (0) ... a (n-1) , anche se a (n + m) == a (n) .
  • 42 sarà prima di 43, poiché il suo duplicato si verifica prima del duplicato di 43
  • La sequenza non è ordinata
  • Ci sono elementi duplicati anche in questa sequenza. Ad esempio, il 12 ° e il 23 ° numero sono entrambi 262 (indicizzati 0).

Casi di test (indicizzati 0)

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

Questo è , quindi vince il codice più corto in ogni lingua!

Le spiegazioni sono incoraggiate!



Perché non viene 43prodotto prima 42? Appare per primo nella sequenza di Recamán. Intendi prima l'output di quello che si trova per primo un duplicato?
Luis Mendo,

1
43424243

Ho anche visto di recente la popolare domanda matematica.SE: P
orlp,

@orlp eh? Puoi collegarti ad esso? Non l'ho visto ...
Stewie Griffin,

Risposte:


5

Wolfram Language (Mathematica) , 88 85 76 byte

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

Provalo online!

1-indicizzati.

Spiegazione

For[

For ciclo continuo.

i=k=j=p=0

Inizia con i(={un'1,un'2,...}kj=np=un'n-1

k<#

Ripeti mentre kè inferiore all'input.

i=i|p

Append pper iusare la testa Alternatives(una versione Golfier di Listin questo caso).

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

Incremento jpjun'n-1>np-jiun'n-1-np-jpj

i~FreeQ~p||k++

Ogni iterazione, incrementa kse pnon è i( altrimenti ||(= or) i cortocircuiti).

... ;p

Ritorno p.





2

JavaScript (ES6), 66 59 byte

Restituisce il termine N-esimo , indicizzato 0.

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

Provalo online!

Come?

Usiamo g () come nostra principale funzione ricorsiva e come oggetto per tenere traccia dei duplicati.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.