The Recamán's sequence generates Natural numbers.

Starting from a(0)=0, the n'th term a(n), where n>0, is the previous term minus n i.e a(n) = a(n-1) - n but only if this is both positive and has not been previousely generated.


If the conditions don't hold then a(n) = a(n-1) + n.



Task

 Generate and show here the first 15 members of the sequence.
 Find and show here, the first duplicated number in the sequence.
 Optionally: Find and show here, how many terms of the sequence are needed until all the integers 0..1000, inclusive, are generated.


References

 A005132, The On-Line Encyclopedia of Integer Sequences.
 The Slightly Spooky Recamán Sequence, Numberphile video.
 Recamán's sequence, on Wikipedia.


F recamanSucc(seen, n, r)
   ‘The successor for a given Recaman term,
    given the set of Recaman terms seen so far.’
   V back = r - n
   R I 0 > back | (back C seen) {n + r} E back
 
F recamanUntil(p)
   ‘All terms of the Recaman series before the
    first term for which the predicate p holds.’
   V n = 1
   V r = 0
   V rs = [r]
   V seen = Set(rs)
   V blnNew = 1B
   L !p(seen, n, r, blnNew)
      r = recamanSucc(seen, n, r)
      blnNew = r !C seen
      seen.add(r)
      rs.append(r)
      n = 1 + n
   R rs
 
F enumFromTo(m)
   ‘Integer enumeration from m to n.’
   R n -> @m .< 1 + n
 
print("First 15 Recaman:\n "recamanUntil((seen, n, r, _) -> n == 15))
print("First duplicated Recaman:\n "recamanUntil((seen, n, r, blnNew) -> !blnNew).last)
V setK = Set(enumFromTo(0)(1000))
print("Number of Recaman terms needed to generate all integers from [0..1000]:\n "(recamanUntil((seen, n, r, blnNew) -> (blnNew & r < 1001 & :setK.is_subset(seen))).len - 1))