레카 만의 사본


14

Recamán의 시퀀스 는 다음과 같이 정의됩니다.

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

또는 의사 코드로 :

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. 

첫 번째 숫자는 ( 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

이 순서를 연구하면 예를 들어 a(20) = a(24) = 42(0 인덱스) 와 같은 중복이 있음을 알 수 있습니다 . 시퀀스에서 하나 이상의 동일한 번호가있는 경우 중복 번호를 호출합니다.


도전:

정수 입력 k 를 취하고 Recamán의 시퀀스에서 중복으로 발견되는 순서대로 첫 번째 k 중복 숫자를 출력하거나 k 번째 숫자 .

이 첫 번째 중복 번호는 다음과 같습니다.

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

몇 가지 참고할 사항 :

  • a (n + m) == a (n) 인 경우에도 a (0) ... a (n-1)에 동일한 숫자가없는 경우 a (n) 은 중복으로 계산되지 않습니다 .
  • 42는 43 이전입니다. 43의 복제 전에 복제가 발생하기 때문입니다.
  • 순서는 정렬되지 않습니다
  • 이 순서에도 중복 요소가 있습니다. 예를 들어 12 번째와 23 번째 숫자는 모두 262 (0 인덱스)입니다.

테스트 사례 (0 인덱스)

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

이것은 이므로 각 언어에서 가장 짧은 코드가 승리합니다!

설명이 권장됩니다!



43이전에 출력 되지 42않습니까? Recamán의 순서에서 처음으로 나타납니다. 먼저 중복 된 것으로 처음 출력 된 것을 의미합니까?
Luis Mendo 2016 년

1
43424243

나는 또한 인기있는 수학을 보았습니다 .SE 질문 최근에 ​​: P
orlp

@orlp 허? 당신은 그것에 연결할 수 있습니까? 나는 그것을 보지 못했다 ...
Stewie Griffin

답변:


5

Wolfram Language (Mathematica) , 88 85 76 바이트

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

온라인으로 사용해보십시오!

1- 색인.

설명

For[

For 고리.

i=k=j=p=0

i={1,2,}kj=p=1

k<#

k입력보다 작을 때 반복 하십시오.

i=i|p

헤드 ( 이 경우 골퍼 버전) pi사용하는 것에 추가 합니다 .AlternativesList

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

jpj1>p-ji1p-jpj

i~FreeQ~p||k++

각 반복 은 그렇지 않은 k경우 증가 합니다 ( 그렇지 않으면 (= ) 단락).pi||or

... ;p

을 반환 p합니다.





2

자바 스크립트 (ES6), 66 59 바이트

N 번째 항을 0으로 인덱스 하여 반환합니다 .

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

온라인으로 사용해보십시오!

어떻게?

우리는 사용 () g을 우리의 주요 재귀 함수로 중복을 추적하는 개체로.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.