Self numbers: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: added solution)
Line 811: Line 811:
Overall took 14.647314803s
Overall took 14.647314803s
</pre>
</pre>

=={{header|Haskell}}==
The solution is quite straightforward. The length of the foreseeing window in filtering procedure (81) is chosen empirically and doesn't have any theoretical background.

<lang haskell>import Control.Monad (forM_)
import Text.Printf

selfs :: [Integer]
selfs = sieve (sumFs [0..]) [0..]
where
sumFs = zipWith (+) [ a+b+c+d+e+f+g+h+i+j
| a <- [0..9] , b <- [0..9]
, c <- [0..9] , d <- [0..9]
, e <- [0..9] , f <- [0..9]
, g <- [0..9] , h <- [0..9]
, i <- [0..9] , j <- [0..9] ]

-- More idiomatic list generator is about three times slower
-- sumFs = zipWith (+) $ sum <$> replicateM 10 [0..9]

sieve (f:fs) (n:ns)
| n > f = sieve fs (n:ns)
| n `notElem` take 81 (f:fs) = n : sieve (f:fs) ns
| otherwise = sieve (f:fs) ns

main = do
print $ take 50 selfs
forM_ [1..8] $ \i ->
printf "1e%v\t%v\n" (i :: Int) (selfs !! (10^i-1))</lang>

<pre>$ ghc -O2 SelfNum.hs && time ./SelfNum
[1,3,5,7,9,20,31,42,53,64,75,86,97,108,110,121,132,143,154,165,176,187,198,209,211,222,233,244,255,266,277,288,299,310,312,323,334,345,356,367,378,389,400,411,413,424,435,446,457,468]
1e1 64
1e2 973
1e3 10188
1e4 102225
1e5 1022675
1e6 10227221
1e7 102272662
1e8 1022727208
275.98 user 3.11 system 4:41.02 elapsed</pre>


=={{header|Java}}==
=={{header|Java}}==