fork(2) download
  1. import Data.List (permutations, nub)
  2.  
  3. -- Parte 1, Solução 1, corrigida
  4. somaPerm :: (Integral a, Read a, Show a) => a -> a
  5. somaPerm = sum . map read . nub . permutations . show
  6.  
  7. -- Parte 1, Solução 2, corrigida
  8. somaPerm2 n = fact ((ndig n) - diff n) * (sum . digs $ n) * (ones $ length $ show n)
  9. where
  10. diff n = (ndig n) - (length $ nub . show $ n) + 1
  11. ndig n = length $ show n
  12.  
  13. fact n = product [1..n]
  14.  
  15. digs 0 = []
  16. digs n = (n `mod` 10) : digs (n `div` 10)
  17.  
  18. ones n = (1+) . sum . map (10^) $ [1..n-1]
  19.  
  20. -- Parte 2
  21. capicua n = (show n) == (reverse $ show n)
  22. soma1000cap = nub $ filter capicua $ map somaPerm [10..1000]
  23. capicuas = let cap x = capicua $ somaPerm x in nub $ filter cap [10..1000]
  24.  
  25. main :: IO()
  26. main = do
  27. n <- (readLn :: IO Int)
  28. putStrLn $ "Metodo 1: " ++ (show $ somaPerm n)
  29. putStrLn $ "Metodo 2: " ++ (show $ somaPerm2 n)
  30. putStrLn $ "10 a 1000, quais dao capicuas: " ++ show capicuas
  31. putStrLn $ "Capicuas distintas, de 10 a 1000: " ++ show soma1000cap
Success #stdin #stdout 0.07s 5812KB
stdin
223
stdout
Metodo 1: 777
Metodo 2: 777
10 a 1000, quais dao capicuas: [10,11,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,29,30,31,32,33,34,35,36,38,40,41,42,43,44,45,47,50,51,52,53,54,55,56,60,61,62,63,65,66,70,71,72,74,77,80,81,83,88,90,92,99,100,101,102,103,110,111,112,113,114,115,116,117,119,120,121,122,128,130,131,133,137,141,144,146,151,155,161,164,171,173,182,191,200,201,202,209,210,211,212,218,220,221,222,223,224,225,227,232,233,236,242,245,252,254,263,272,281,290,300,301,303,308,310,311,313,317,322,323,326,330,331,332,333,335,344,353,362,371,380,400,404,407,411,414,416,422,425,434,440,441,443,444,452,461,470,499,500,506,511,515,522,524,533,542,551,555,560,589,598,600,605,611,614,623,632,641,650,666,679,688,697,700,704,711,713,722,731,740,769,777,778,787,796,800,803,812,821,830,859,868,877,886,888,895,900,902,911,920,949,958,967,976,985,994,999,1000]
Capicuas distintas, de 10 a 1000: [11,33,44,55,66,77,88,99,22,121,111,222,666,888,444,555,777,999,1221,2442,333,4884,1111]