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}}== |