28 lines
727 B
Nim
28 lines
727 B
Nim
|
|
import sequtils, sets, strutils
|
|||
|
|
|
|||
|
|
iterator recaman(num: Positive = Natural.high): tuple[n, a: int; duplicate: bool] =
|
|||
|
|
var a = 0
|
|||
|
|
yield (0, a, false)
|
|||
|
|
var known = [0].toHashSet
|
|||
|
|
for n in 1..<num:
|
|||
|
|
var next = a - n
|
|||
|
|
if next <= 0 or next in known:
|
|||
|
|
next = a + n
|
|||
|
|
a = next
|
|||
|
|
yield (n, a, a in known)
|
|||
|
|
known.incl a
|
|||
|
|
|
|||
|
|
echo "First 15 numbers in Recaman’s sequence: ", toSeq(recaman(15)).mapIt(it.a).join(" ")
|
|||
|
|
|
|||
|
|
for (n, a, dup) in recaman():
|
|||
|
|
if dup:
|
|||
|
|
echo "First duplicate found: a($1) = $2".format(n, a)
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
var target = toSeq(0..1000).toHashSet
|
|||
|
|
for (n, a, dup) in recaman():
|
|||
|
|
target.excl a
|
|||
|
|
if target.card == 0:
|
|||
|
|
echo "All numbers from 0 to 1000 generated after $1 terms.".format(n)
|
|||
|
|
break
|