fork(1) download
  1. import Data.List (permutations, nub)
  2.  
  3. -- Parte 1, Solução 1
  4. somaPerm :: (Integral a, Read a, Show a) => a -> a
  5. somaPerm = sum . map read . permutations . show
  6.  
  7. -- Parte 1, Solução 2
  8. somaPerm2 n = fact ((length $ show n) - 1) * (sum $ digs n) * (ones $ length $ show n)
  9. where
  10. fact n = product [1..n]
  11.  
  12. digs 0 = []
  13. digs n = (n `mod` 10) : digs (n `div` 10)
  14.  
  15. ones n = (1+) . sum . map (10^) $ [1..n-1]
  16.  
  17. -- Parte 2
  18. capicua n = (show n) == (reverse $ show n)
  19. soma1000cap = nub $ filter capicua $ map somaPerm [1..1000]
  20. capicuas = let cap x = capicua $ somaPerm x in nub $ filter cap [1..1000]
  21.  
  22. main :: IO()
  23. main = do
  24. n <- (readLn :: IO Int)
  25. putStrLn $ "Metodo 1: " ++ (show $ somaPerm n)
  26. putStrLn $ "Metodo 2: " ++ (show $ somaPerm2 n)
  27. putStrLn $ "1 a 1000, quais dao capicuas: " ++ show capicuas
  28. putStrLn $ "Capicuas distintas, de 1 a 1000: " ++ show soma1000cap
Success #stdin #stdout 0.08s 5768KB
stdin
15280
stdout
Metodo 1: 4266624
Metodo 2: 4266624
1 a 1000, quais dao capicuas: [1,2,3,4,5,6,7,8,9,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,56,60,61,62,63,65,70,71,72,74,80,81,83,90,92,100,101,102,103,110,111,112,119,120,121,128,130,137,146,155,164,173,182,191,200,201,202,209,210,211,218,220,227,236,245,254,263,272,281,290,300,301,308,310,317,326,335,344,353,362,371,380,400,407,416,425,434,443,452,461,470,499,506,515,524,533,542,551,560,589,598,605,614,623,632,641,650,679,688,697,704,713,722,731,740,769,778,787,796,803,812,821,830,859,868,877,886,895,902,911,920,949,958,967,976,985,994,1000]
Capicuas distintas, de 1 a 1000: [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99,121,222,444,666,888,2442,4884,6666]