48 lines
1.3 KiB
Haskell
48 lines
1.3 KiB
Haskell
import Data.List (find, findIndex, nub)
|
|
import Data.Maybe (fromJust)
|
|
import Data.Set (Set, fromList, insert, isSubsetOf, member)
|
|
|
|
--- INFINITE STREAM OF RECAMAN SERIES OF GROWING LENGTH --
|
|
rSeries :: [[Int]]
|
|
rSeries =
|
|
scanl
|
|
( \rs@(r : _) i ->
|
|
let back = r - i
|
|
nxt
|
|
| 0 > back || elem back rs = r + i
|
|
| otherwise = back
|
|
in nxt : rs
|
|
)
|
|
[0]
|
|
[1 ..]
|
|
|
|
----------- INFINITE STREAM OF RECAMAN-GENERATED ---------
|
|
--------------- INTEGER SETS OF GROWING SIZE -------------
|
|
rSets :: [(Set Int, Int)]
|
|
rSets =
|
|
scanl
|
|
( \(seen, r) i ->
|
|
let back = r - i
|
|
nxt
|
|
| 0 > back || member back seen = r + i
|
|
| otherwise = back
|
|
in (insert nxt seen, nxt)
|
|
)
|
|
(fromList [0], 0)
|
|
[1 ..]
|
|
|
|
--------------------------- TEST -------------------------
|
|
main :: IO ()
|
|
main = do
|
|
let setK = fromList [0 .. 1000]
|
|
(putStrLn . unlines)
|
|
[ "First 15 Recamans:",
|
|
show . reverse . fromJust $ find ((15 ==) . length) rSeries,
|
|
[],
|
|
"First duplicated Recaman:",
|
|
show . head . fromJust $ find ((/=) <$> length <*> (length . nub)) rSeries,
|
|
[],
|
|
"Length of Recaman series required to include [0..1000]:",
|
|
show . fromJust $ findIndex (\(setR, _) -> isSubsetOf setK setR) rSets
|
|
]
|