Дублікати Рекамана


14

Послідовність Ремамана визначається наступним чином:

an={0if n = 0an1nif an1n>0 and is not already in the sequence,an1+nінакше

або в псевдокоді:

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 і виведіть або перші 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) не вважається дублікатом, якщо в (0) ... a (n-1) немає однакових чисел , навіть якщо a (n + m) == 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? Він з’являється спочатку в послідовності Рекамана. Ви маєте на увазі вихід спочатку той, який вперше виявляється дублікатом?
Луїс Мендо

1
43424243

Я також побачив нещодавно популярне питання math.SE: P
orlp

@orlp так? Чи можете ви пов’язати це? Я цього не бачив ...
Стюі Гріффін

Відповіді:


5

Мова Вольфрама (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={a1,a2,}kj=np=an1

k<#

Повторіть, поки kменше введення.

i=i|p

Додайте pдо iвикористання голову Alternatives( Listв цьому випадку версія для гравців ).

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

jpjан-1>нp-jiан-1-нp-jpj

i~FreeQ~p||k++

Кожна ітерація, приріст, kякщо pїї немає i(в іншому випадку ||(= or) коротке замикання).

... ;p

Повернення p.





2

JavaScript (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.