g | x | w | all
Bytes Lang Time Link
035Wolfram Language Mathematica190611T001140Zatt
017Uiua 0.10.0240228T053032ZTbw
5511Nibbles230130T234110ZDominic
037JavaScript ES6190610T215940ZArnauld
008Vyxal221020T153218Zu-ndefin
042Haskell201101T143949Zlynn
013Arn f201101T141224ZZippyMag
007Husk201031T235537ZLegionMa
018Pyth190821T083934Zar4093
099Python 3190613T133433Zruohola
189C++ clang190617T174146Zruohola
090DC190618T185134ZFlexEast
077C# Visual C# Interactive Compiler190612T104706Zdana
076Java190611T133544ZAchaaab
069Clojure190612T102503ZNikoNyrh
015CJam190612T073253ZPeter Ta
051Python190611T231733Zxnor
042Perl 6190610T224157ZJo King
095Red190611T071426ZGalen Iv
102Bourne shell190611T041514Zjnfnt
112Python 3190610T212727Zhyper-ne
062Python 3190610T213938ZArBo
017APL Dyalog Unicode190611T140630ZSherlock
011Japt h190611T151507ZShaggy
061Haskell190611T145323Znimi
066Haskell190611T063856Zflawr
00805AB1E190611T123301ZKevin Cr
042Perl 5 p190611T121546ZGrimmy
023J190610T220324ZJonah
063C gcc190610T232930Zatt
008Jelly190610T220824ZJonathan
009Stax190610T212633Zrecursiv
023Charcoal190610T215006ZNeil
007Jelly190610T214955ZErik the
062R190610T212202ZGiuseppe

Wolfram Language (Mathematica), 48 45 42 35 bytes

Nest[0&@@a++[a@#=1;#]&,a=<||>;0,#]&

Try it online!

Zero-indexed.

                       a=<||>;0     initial: no distances, value 0
Nest[                 ,        ,#]  do N times:
         a  [     ;#]                 distance to last value
     0&@@                               default 0
         a++ a@#=1                    update distances

Uiua 0.10.0, 17 bytes SBCS

⊢⍥(⊂⬚0⊡1⊚⌕⊢..):¤0

Try on Uiua Pad! Constructs the sequence in reverse order and then just takes the first entry. Golfed from a solution by @5imon in the Uiua Discord

Nibbles, 5.5 bytes (11 nibbles)

=$.~~0?`)$
=$           # get the input-th element of:
  .~~        #   append until null (=for ever)
     0       #   starting with 0
      ?      #     get the index (or 0 if absent)
       `)$   #     in the list-so-far without its first element
             #     of its first element

I expected to need to reverse (\) the list-so-far (so: =$.~~0?`)\$ for 6 bytes), but somehow this works without doing that. I'm not sure why.

enter image description here

JavaScript (ES6),  46 41  37 bytes

n=>(g=p=>--n?g(g[p]-n|0,g[p]=n):p)(0)

Try it online!

How?

We don't need to store the full sequence. We only need to keep track of the last position of each integer that appears in the sequence. We use the underlying object of the recursive function \$g\$ for that purpose.

For a given term \$p\$, we don't need either to set \$g[p]\$ to its actual absolute position in the sequence because we're only interested in the distance with the current position. That's why we can just store the current value of the input \$n\$, which is used as a decrementing counter in the code.

Therefore, the distance is given by \$g[p]-n\$. Conveniently, this evaluates to NaN if this is the first occurrence of \$p\$, which can be easily turned into the expected \$0\$.

Commented

n => (           // n = input
  g = p =>       // g = recursive function taking p = previous term of the
                 //     sequence; g is also used as an object to store the
                 //     last position of each integer found in the sequence
    --n ?        // decrement n; if it's not equal to 0:
      g(         //   do a recursive call:
        g[p] - n //     subtract n from the last position of p
                 //     if g[p] is undefined, the above expression evaluates
        | 0,     //     to NaN, in which case we coerce it to 0 instead
        g[p] = n //     update g[p] to n
      )          //   end of recursive call
    :            // else:
      p          //   we've reached the requested term:
                 //   stop the recursion and return it
)(0)             // initial call to g with p = 0

Vyxal, 8 bytes

W?(p:ḣḟ›

Try it Online! 1-indexed.

Explanation:

Since \$a(n) < n\$, we can push \$n\$ to the beginning of the list. Also builds the sequence backwards.

W?(p:ḣḟ› # whole program

W        # []
 ?       #            input
  (      # repeat for       times:
   p     #  prepend to list (uses implicit input the first time)
    :    #  duplicate
     ḣ   #  split head from the rest
      ḟ  #  find its index on the list (-1 if none)
       › #  increment
         # as we didn't prepend the last item, output it 

Haskell, 42 bytes

f n=last$0:[n-j-1|j<-[0..n-2],f j==f(n-1)]

Try it online!

Other Haskell answers: 66 bytes by flawr and 61 bytes by nimi.

Arn -f, 13 bytes

f→S›J⁻僃N5═%

Try it! 0-indexed

Explained

Unpacked: &.{++.{:i:{)|}[

&.            Mutate S N times
  {             With block, key of `_`
      ++        Increment
            _   Implicit
          .{    Behead
        :i      Index of
            _   Implicit
          :{    Head
      )     Don't ask
    |           Concatenated with
      _         Implicit
  }             End block
  [           Where S is an array
  ]             Ending implicit
  _           And N is STDIN; implicit
            Then take the head

Husk, 8 7 bytes

!¡oΓ€↔ø

Try it online! The behavior of is surprisingly helpful here.

Pyth, 18 bytes

VQ=Y+?YhxtYhY0Y;hY

Try it online!

Builds up the sequence in reverse and prints the first element (last term of the sequence).

VQ                 # for N in range(Q) (Q=input)
  =Y+         Y    # Y.prepend(
        xtY        #   Y[1:].index(    )
           hY      #               Y[0]
       h           #                     +1
     ?Y      0     #                        if Y else 0)
               ;hY # end for loop and print Y[0]

Python 3, 128 114 111 102 99 bytes

102 -> 99 bytes, thanks to Jonathan Frech

f=lambda n,i=1,l=[0]:f(n,i+1,l+[l[i-2::-1].index(l[-1])+1if l[-1]in l[:-1]else 0])if n>i else l[-1]

Try it online!

C++ (clang), 241 235 234 219 197 189 bytes

197 -> 189 bytes, thanks to ceilingcat

#import<bits/stdc++.h>
int f(int n,int i=0,std::vector<int>l={0}){return~-n>i?l.push_back(find(begin(l),end(l)-1,l[i])-end(l)+1?find(rbegin(l)+1,rend(l),l[i])-rbegin(l):0),f(n,i+1,l):l[i];}

Try it online!

DC, 94 91 90 bytes

Input is taken during the program. Save this to a file and then do "dc " to run. Definitely not the shortest, but I have fun with challenges like these in dc. Input is 1-based index, as preferred.

[st1si0swlbxltlwlu1-sulu0!=m]sm[dlt=qSsli1+siz0!=b0siLs]sb[0pq]sf[lisw2Q]sq?2-dsu1>f0dlmxp

Main control macro
[st                         ]sm   save top value as target
[  1si0sw                   ]sm   reset i to 1 and w to 0
[        lbx                ]sm   execute macro b to get next value in w
[           ltlw            ]sm   restore target to the stack and add w to the stack
[               lu1-su      ]sm   decrement the user inputted variable
[                     lu0!=m]sm   if the user inputted variable is not 0 recurse

Next value finder macro
[dlt=q                  ]sb     if the value on the stack is the target, quit
[     Ss                ]sb     save top value to s register
[       li1+si          ]sb     increment i register
[             z0!=b     ]sb     recurse if still more values            
[                  0si  ]sb     set i to 0 (will be saved to w if relevant)
[                     Ls]sb     move top value of s register to stack

[lisw2Q]sq   Load i, save it to w, and then quit this macro and the one that called it

[0pq]sf print 0 and quit the program
```

C# (Visual C# Interactive Compiler), 77 bytes

n=>{int i,v=0;for(var m=new int[n];--n>0;m[v]=n,v=i<1?0:i-n)i=m[v];return v;}

Try it online!

Pretty much a port of the Java answer at this point.

Java, 96 80 76 bytes

n->{int i,v=0,m[]=new int[n];for(;--n>0;m[v]=n,v=i<1?0:i-n)i=m[v];return v;}

Not obfuscated:

Function<Integer, Integer> vanEck =
n -> {

    int i;                  // i is the value of n when v was previously encountered
    int v = 0;              // v is the current element of vanEck sequence
    int[] m = new int[n];   // m[v] is the value of n when v was previously encountered

    while (--n > 0) {       // n is used as a decrementing counter

        i = m[v];
        m[v] = n;
        v = i == 0 ? 0 : i - n;
    }

    return v;
};

Clojure, 69 bytes

#((fn f[i c t](if(= i 1)t(f(dec i)(assoc c t i)(-(or(c t)i)i))))%{}0)

Sadly a more functional approach seems to be longer.

CJam (15 bytes)

0a{_(#)\+}qi*0=

Online demo. This is a full program and 0-indexed.

Dissection

0a      e# Push the array [0]
{       e# Loop...
  _(#   e#   Copy the array, pop the first element, and find its index in the array
  )\+   e#   Increment and prepend
}qi*    e# ... n times, where n is read from stdin
0=      e# Take the first element of the array

Python, 51 bytes

f=lambda n,i=1:n>i and[f(n,i+1),i][f(n-1)==f(n+~i)]

Try it online!

Outputs False for 0. Implements the spec pretty literally, looking for the lowest positive integer i such that f(n-1)==f(n-i-1). If such a search leads to i>=n, the previous element hasn't appeared before and we produce 0.

Instead of doing something reasonable like storing earlier values in a list, the function just recomputes them recursively from scratch whenever they're needed, and sometimes when they're not needed. This makes the function run very slowly for inputs above 10 or so.

Perl 6, 47 42 bytes

-5 bytes thanks to nwellnhof

{({+grep(@_[*-1],:k,[R,] @_)[1]}...*)[$_]}

Try it online!

Anonymous codeblock that outputs the 0-indexed element in the sequence.

Explanation:

{                                            } # Anonymous codeblock
 (                                      )[$_]  # Return the nth element
                                    ...*       # Of the infinite sequence
  {                            }  # Where each element is
    grep(        :k        )[1]   # The key of the second occurrence
         @_[*-1],                 # Of the most recent element
                   ,[R,] @_       # In the reversed sequence so far
   +     # And numify the Nil to 0 if the element is not found

Red, 106 95 bytes

func[n][b: copy[0]loop n[insert b either not find t: next b
b/1[0][-1 + index? find t b/1]]b/2]

Try it online!

Bourne shell, 102 bytes

until [ 0"$i" -eq $1 ];do i=$((${i:-0}+1)) a=${n:-0};eval 'n=$(($i-${m'$a:-$i'}))' m$a=$i;done;echo $a

try it online

Python 3, 112 bytes

a=[0]
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
print(-a[-2])

Try it online!

-3 bytes thanks to mypetlion

Python 3, 69 63 62 bytes

f=lambda n,l=0,*s:f(n-1,l in s and~s.index(l),l,*s)if n else-l

Try it online!

Note: as Erik the Outgolfer mentioned, this code works fine in Python 2 as well.

0-indexed (although, just to be utterly perverse, you can make it -1-indexed by changing if n to if~n :P)

Makes use of Python's gorgeous unpacking "star operator", to recursively build up the series, until n reaches zero.

The function builds up the series in the reverse order, to avoid having to reverse it for the search. Additionally, it actually stores the negations of all the elements, because converting them back at the end was free (else the - would have had to be a space) and it saves us a byte along the way, by using ~s.index(l) instead of -~s.index(l).

Could be 51 bytes if Python tuples had the same find functions strings do (returning -1 if not found, instead of raising an error), but no such luck...

APL (Dyalog Unicode), 19 17 bytesSBCS

Many thanks to ngn, Adám, Richard Park and H.PWiz for their help in writing and golfing this answer in The APL Orchard, a great place to learn APL and get APL help.

Edit: -2 bytes from Adám.

⊃(⊢,⍨≢|1∘↓⍳⊃)⍣⎕-1

Try it online!

Explanation

⊃(⊢,⍨≢|1∘↓⍳⊃)⍣⎕-1

                 -1  We initialize our array of results with -1.
 (           )⍣⎕    ⍣ repeats the train (in parentheses) our input, ⎕, times.
        1∘↓⍳⊃        We take the index of the head (our last element in the sequence).
                     To signify "element not found", this returns the length of the array.
      ≢|             We take our index modulo the length of the array.
                     This turns our "element not found" from the length of the array to 0.
  ⊢,⍨                And we prepend to our array.
⊃                    Finally, we return the first element of the array,
                     which is the most recently-generated.
                     This is the ⍵-th element of the Van Eck sequence.

Japt -h, 11 bytes

@ÒZÔÅbX}hTo

Try it

Haskell, 61 bytes

(([]#0)1!!)
(l#n)i=n:(((n,i):l)#maybe 0(i-)(lookup n l))(i+1)

0-based indexing.

Try it online!

Haskell, 68 67 66 bytes

Quite straightforward implementation (using 0 based indexing).

f n|all((/=f(n-1)).f)[0..n-2]=0|m<-n-1=[k|k<-[1..],f(m-k)==f m]!!0

Try it online!

05AB1E, 8 bytes

F¯Rćk>Dˆ

Try it online or output the first \$n\$ values in the list.

Explanation:

F         # Loop the (implicit) input amount of times:
 ¯        #  Push the global array
  R       #  Reverse it
   ć      #  Extract the head; push the remainder and the head to the stack
    k     #  Get the 0-based index of the head in the remainder (-1 if not found)
     >    #  Increase it by 1 to make it 1-indexed (or 0 if not found)
      Dˆ  #  Add a copy to the global array
          # (after the loop, output the top of the stack implicitly as result,
          #  which is why we need the `D`/duplicate)

Perl 5 (-p), 42 bytes

map{($\,$\{$\})=0|$\{$\};$_++for%\}1..$_}{

Try it online!

J, 29 23 bytes

1{(,~#|1+}.i.{.)@]^:[&0

Try it online!

The real work is done in the iteration verb of the power verb ^:, which iterates as many times as the argument [, starting the iteration with the constant value 0 &0...

C (gcc), 63 bytes

f(n){n=g(n,--n);}g(n,i){n=n>0?f(--n)-f(i)?g(n,i)+!!g(n,i):1:0;}

Try it online!

0-indexed.

Jelly, 8 bytes

ẎiḢ$;µ¡Ḣ

A monadic Link accepting a positive integer, \$n\$, which yields the \$n^{th}\$ term of the Van Eck Sequence.

Try it online!

How?

ẎiḢ$;µ¡Ḣ - Link: n
     µ¡  - repeat this monadic link n times - i.e. f(f(...f(n)...)):
         - (call the current argument L)
Ẏ        -   tighten (ensures we have a copy of L, so that Ḣ doesn't alter it)
   $     -   last two links as a monad:
  Ḣ      -     head (pop off & yield leftmost of the copy)
 i       -     first index (of that in the rest) or 0 if not found
    ;    -   concatenate with L
       Ḣ - head

Note that without the final we've actually collected [a(n), a(n-1), ..., a(2), a(1), n]

Stax, 10 9 bytes

é"▬π²"ô↕j

Run and debug it

If 0-based indexing is allowed:

Stax, 8 bytes

à┐æ8Å/[┤

Run and debug it

Charcoal, 23 bytes

≔⁰θF⊖N«≔⊕⌕⮌υθη⊞υθ≔ηθ»Iθ

Try it online! Link is to verbose version of code. Explanation:

≔⁰θ

Set the first term to 0.

F⊖N«

Loop n-1 times. (If 0-indexing is acceptable, the can be removed for a 1-byte saving.)

≔⊕⌕⮌υθη

The next term is the incremented index of the current term in the reversed list of previous terms.

⊞υθ

Add the current term to the list of previous terms.

≔ηθ

Set the current term to the next term.

»Iθ

Print the current term at the end of the loop.

Jelly, 7 bytes

Ḷ߀ṚiḢ$

Try it online!

0-indexed.

R, 62 bytes

function(n){while(sum(F|1)<n)F=c(match(F[1],F[-1],0),F)
+F[1]}

Try it online!

Builds the list in reverse; match returns the first index of F[1] (the previous value) in F[-1] (the remainder of the list), returning 0 if no match is found.

F is initialized to FALSE and is coerced to 0 on the first pass of the while loop.