Bản sao của Recamán


14

Trình tự của Recamán được định nghĩa như sau:

mộtn= ={0nếu n = 0mộtn-1-nnếu mộtn-1-n>0 và chưa có trong trình tự,mộtn-1+nnếu không thì

hoặc bằng mã giả:

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. 

Các số đầu tiên là ( 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

Nếu bạn nghiên cứu trình tự này, bạn sẽ nhận thấy rằng có các bản sao, ví dụ a(20) = a(24) = 42(0-index). Chúng tôi sẽ gọi một số là một bản sao nếu có ít nhất một số giống nhau ở trước số đó trong chuỗi.


Thử thách:

Lấy một đầu vào số nguyên k và xuất ra các số trùng lặp k đầu tiên theo thứ tự chúng được tìm thấy dưới dạng trùng lặp trong Chuỗi của Recamán, hoặc chỉ số thứ k .

Số trùng lặp đầu tiên này là:

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

Một số điều cần lưu ý:

  • a (n) không được tính là trùng lặp nếu không có số nào giống nhau trong a (0) ... a (n-1) , ngay cả khi a (n + m) == a (n) .
  • 42 sẽ trước 43, vì trùng lặp của nó xảy ra trước 43 trùng lặp
  • Trình tự không được sắp xếp
  • Có các yếu tố trùng lặp trong chuỗi này quá. Ví dụ, số thứ 12 và số thứ 23 đều là số 262 (được lập chỉ mục 0).

Các trường hợp thử nghiệm (0 chỉ mục)

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

Đây là , vì vậy mã ngắn nhất trong mỗi ngôn ngữ sẽ thắng!

Giải thích được khuyến khích!



Tại sao không phải là 43đầu ra trước 42? Nó xuất hiện đầu tiên trong chuỗi của Recamán. Bạn có nghĩa là đầu ra đầu tiên là đầu tiên được tìm thấy là một bản sao?
Luis Mendo

1
43424243

Tôi cũng, đã thấy câu hỏi toán học phổ biến. Gần đây: P
orlp

@orlp hả? Bạn có thể liên kết với nó? Tôi chưa thấy nó ...
Stewie Griffin

Câu trả lời:


5

Ngôn ngữ Wolfram (Mathicala) , 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)&

Hãy thử trực tuyến!

1 chỉ mục.

Giải trình

For[

For vòng.

i=k=j=p=0

i= ={một1,một2,Giáo dục}kj= =np= =mộtn-1

k<#

Lặp lại trong khi kít hơn đầu vào.

i=i|p

Nối pđể isử dụng đầu Alternatives(một phiên bản golfier của Listtrong trường hợp này).

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

jpjmộtn-1>np-jimộtn-1-np-jpj

i~FreeQ~p||k++

Mỗi lần lặp, tăng knếu pkhông ở i( ||(= or) ngắn mạch khác).

... ;p

Quay trở lại p.





2

JavaScript (ES6), 66 59 byte

Trả về số hạng N , 0 được lập chỉ mục.

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

Hãy thử trực tuyến!

Làm sao?

Chúng tôi sử dụng g () làm hàm đệ quy chính của chúng tôi làm đối tượng để theo dõi các bản sao.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.