0votos

Numero equilibrado en Haskell

por josejuan hace 4 años

Precomputando rotaciones se obtiene un speedup impresionante. Solución que no considera la paridad de las longitudes (requiere un ajuste en los últimos dígitos).

numero invertido mas numero original C++

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
31
32
33
34
35
36
import System.Environment 
import Control.Applicative 
import Data.List 
import System.TimeIt 
import Data.Vector ((!)) 
import qualified Data.Vector as V 
 
simple :: Integer -> Integer 
simple n = n + (read.reverse.show) n 
 
 
rápida :: Integer -> Integer 
rápida n = n + flipNum n 
 
flipNum :: Integer -> Integer 
flipNum n = p n 0 
    where p 0 a = a 
          p z a = let (d, r) = z `divMod` 10000 
                  in  p d (10000 * a + pc!(fromIntegral r)) 
 
pc :: V.Vector Integer 
pc = V.fromList $ map (read.reverse.show) [0..9999] 
 
{- 
 
#### SIN CHUNKS 
D:\Projects\haskell>nequilbrado.exe 0 800000 
330 
CPU time:  11.95s 
 
#### CON CHUNKS 
D:\Projects\haskell>nequilbrado.exe 1 800000 
330 
CPU time:   2.28s 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.