Duplikaty Recamána


14

Sekwencja Recamana jest zdefiniowana następująco:

zan={0jeśli n = 0zan-1-ngdyby zan-1-n>0 i nie jest już w sekwencji,zan-1+nInaczej

lub w pseudokodzie:

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. 

Pierwsze liczby to ( 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

Jeśli przestudiujesz tę sekwencję, zauważysz, że istnieją duplikaty, na przykład a(20) = a(24) = 42(indeksowane 0). Będziemy nazywać numer duplikatem, jeśli przed nim jest co najmniej jeden identyczny numer.


Wyzwanie:

Weź liczbę całkowitą k i wypisz pierwsze k duplikatów liczb w kolejności, w jakiej zostały znalezione jako duplikaty w Sekwencji Recamána, lub tylko liczbę k -tą.

Te pierwsze zduplikowane numery to:

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

Kilka rzeczy do zapamiętania:

  • a (n) nie liczy się jako duplikat, jeśli nie ma identycznych liczb w (0) ... a (n-1) , nawet jeśli a (n + m) == a (n) .
  • 42 będzie przed 43, ponieważ jego duplikat występuje przed duplikatem 43
  • Sekwencja nie jest posortowana
  • W tej sekwencji są również zduplikowane elementy. Na przykład, 12 i 23 liczba są równe 262 (indeksowane 0).

Przypadki testowe (indeksowane 0)

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

To jest , więc wygrywa najkrótszy kod w każdym języku!

Wyjaśnienia są zachęcane!



Dlaczego 43dane wyjściowe nie są wcześniej 42? Najpierw pojawia się w sekwencji Recamána. Czy masz na myśli przede wszystkim wynik, który po raz pierwszy jest duplikatem?
Luis Mendo

1
43424243

Ja również widziałem ostatnio popularne pytanie matematyczne: P
orlp

@orlp huh? Czy możesz do niego link? Nie widziałem tego ...
Stewie Griffin

Odpowiedzi:


5

Wolfram Language (Mathematica) , 88 85 76 bajtów

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

Wypróbuj online!

1-indeksowany.

Wyjaśnienie

For[

For pętla.

i=k=j=p=0

i={za1,za2),}kj=np=zan-1

k<#

Powtarzaj, dopóki kjest mniej niż wejście.

i=i|p

Dołącz pdo ikorzystania z głowy Alternatives( Listw tym przypadku wersja dla golfistów ).

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

jpjzan-1>np-jizan-1-np-jpj

i~FreeQ~p||k++

Każda iteracja, inkrementacja, kjeśli pnie występuje i(w przeciwnym razie ||(= or) zwarcia).

... ;p

Return p.





2

JavaScript (ES6), 66 59 bajtów

Zwraca N-ty termin, indeksowany 0.

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

Wypróbuj online!

W jaki sposób?

Używamy g () jako naszej głównej funkcji rekurencyjnej i jako obiektu do śledzenia duplikatów.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.