Recamán'ın kopyaları


14

Recamán'ın Sırası şu şekilde tanımlanır:

an={0if n = 0an1nif an1n>0 and is not already in the sequence,an1+notherwise

veya sözde kodla:

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. 

İlk sayılar ( 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

Bu sırayı incelerseniz, örneğin a(20) = a(24) = 42(0 dizinli) yinelemeler olduğunu fark edeceksiniz . Dizinin önünde en az bir özdeş sayı varsa, bir sayıya yinelenir.


Meydan okuma:

Bir tamsayı k girin ve ya ilk k yinelenen sayıları Recamán Sekansında yinelenen olarak buldukları sırayla veya yalnızca k 'sayısından çıkın .

Bu ilk çoğaltılan numaralar:

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

Unutulmaması gereken birkaç nokta:

  • a (n) , a (n + m) == a (n) olsa bile, (0) ... a (n-1) 'de aynı sayı yoksa, a (n) yinelenmez .
  • 42'si 43'ten önce olacak, çünkü kopyası 43'ün kopyası olmadan önce
  • Dizi sıralanmamış
  • Bu sırayla da yinelenen öğeler var. Örneğin, 12. ve 23. sayıların her ikisi de 262'dir (0 dizinli).

Test senaryoları (0 dizinli)

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

Bu , bu yüzden her dilde en kısa kod kazanır!

Açıklamalar teşvik edilir!



Neden daha 43önce çıktı alınmıyor 42? İlk olarak Recamán'ın dizisinde görünür. İlk önce çoğaltılanın bulunduğu çıktı mı demek istediniz?
Luis Mendo

1
43424243

Ayrıca, popüler matematiği de gördüm.SE sorusu son zamanlarda: P
orlp

@orlp ha? Bağlantı verebilir misiniz?
Stewie Griffin

Yanıtlar:


5

Wolfram Dili (Mathematica) , 88 85 76 bayt

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

Çevrimiçi deneyin!

1 endeksli.

açıklama

For[

For döngü.

i=k=j=p=0

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

k<#

Süre kgirişten daha az.

i=i|p

Ekleme piçin ikafasını kullanarak Alternatives(bir golfier versiyonu Listbu durumda).

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

jpjan1>np-jian1np-jpj

i~FreeQ~p||k++

Her bir yineleme, artım kEğer pdeğil ise i( ||(= or) kısa devre başka bir şekilde).

... ;p

Dönüş p.





2

JavaScript (ES6), 66 59 bayt

0 dizinli N. Terimi döndürür .

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

Çevrimiçi deneyin!

Nasıl?

Ana özyinelemeli fonksiyonumuz ve kopyaları takip etmek için bir nesne olarak g () kullanırız .

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.