Дубликаты Recamán


14

Последовательность Recamán определяется следующим образом:

aNзнак равно{0если n = 0aN-1-Nесли aN-1-N>0 и еще не в последовательности,aN-1+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) не считается дубликатом, если в a (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? Он появляется первым в последовательности Recamán. Ты имеешь в виду, что сначала выводится тот, который впервые обнаружил дубликат?
Луис Мендо

1
43424243

Я также недавно видел популярный вопрос по математике: P
orlp

@ или да? Можете ли вы дать ссылку на него? Я не видел это ...
Стьюи Гриффин

Ответы:


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знак равно{a1,a2,...}kjзнак равноNpзнак равноaN-1 ) равно 0.

k<#

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

i=i|p

Добавить pк iиспользованию головыAlternatives (версия для гольфа Listв этом случае).

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

jpjaN-1>Np-jiaN-1-Np-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.