1votos

AutoNumeros (selfNumbers) en Haskell en Haskell

por josejuan hace 3 años

Todos por debajo de un millón en 0,28 seg.

Realizar el ejercicio acorde a los planteamientos dados en lenguaje de programación Haskell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{-# LANGUAGE FlexibleContexts #-} 
import Data.Array.ST 
import Data.Array.Unboxed 
import Control.Monad.ST 
import Data.Char 
import Control.Monad 
import System.Environment 
 
d :: Int -> Int 
d n = n + sum (map digitToInt $ show n) 
 
self :: Int -> [Int] 
self n = map fst $ filter snd $ assocs (b :: UArray Int Bool) 
  where b = runST $ do 
              c <- newArray (1, n) True :: ST s (STUArray s Int Bool) 
              let chk i = when (i<=n) $ readArray c i >>= \z -> when z $ writeArray c i False >> chk (d i) 
              forM_ [1..(n::Int)] (chk.d) 
              freeze c 
 
main = do 
  n <- (head . map read) <$> getArgs 
  print $ reverse $ take 20 $ reverse $ self n 
 
{- 
 
[josejuan@centella Solveet]$ crono ./self 999999 
[999798,999809,999820,999831,999842,999844,999855,999866,999877,999888,999899,999910,999921,999932,999943,999945,999956,999967,999978,999989] 
Mem: 12668 kbytes. Time: 0:00.28 
 
-} 
1 comentario
0votos

Escrito por Pedro Romero hace 3 años

SOLUCIONADO!
Muy buen trabajo y muy eficiente ademas, en lo personal en mi leksah me marcó unos errores en los import referentes al .cabal (No se exactamente a que se refiera) sin embargo, muy buena solución.
Saludos!
Próximamente mas desafios en haskell!

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.