fork(1) download
  1. -- Algoritmo
  2. pitag n = let lista = [1..n] in [(gcd a b == 1, a, b, c) | a <- lista, b <- lista, c <- lista, a<b && b<c, a^2 + b^2 == c^2, a+b+c <= n]
  3.  
  4. -- Início da interacção com o utilizador:
  5. -- Pergunta qual o modo de input pretendido
  6. main :: IO()
  7. main = do
  8. putStrLn "1 = Introduzir um perímetro máximo\n2 = Introduzir lista de perímetros"
  9. opcao <- (readLn :: IO Int)
  10. if opcao == 1 then mainpitag1 else if opcao == 2 then mainpitag2 else putStrLn "Opção inexistente."
  11.  
  12. -- Hipótese de saída nº 1:
  13. -- Pede perímetro máximo, mostrar números opcional
  14. mainpitag1 :: IO()
  15. mainpitag1 = do
  16. putStrLn $ "Perímetro máximo?"
  17. n <- (readLn :: IO Int)
  18. putStrLn $ "Mostrar trios? (0 = NÃO, outro = SIM)"
  19. mostrar <- (readLn :: IO Int)
  20. mapM_ putStrLn $ let res = pitag n in ("(pitagoreanos, primários) -> " ++
  21. show (length $ res, length . filter (\(a, _, _, _) -> a == True) $ res)) :
  22. (if mostrar /= 0 then map ((" * " ++) . show) res else [])
  23.  
  24. -- Hipótese de saída nº 2:
  25. -- Pede lista de perímetros, mostrar números de cada um opcional
  26. mainpitag2 :: IO()
  27. mainpitag2 = do
  28. putStrLn $ "Lista de perímetros máximos? (e.g., \"[50, 100, 24]\"):"
  29. n <- (readLn :: IO [Int])
  30. putStrLn $ "Mostrar trios? (0 = NÃO, outro = SIM)"
  31. mostrar <- (readLn :: IO Int)
  32. putStrLn $ "Perímetro -> (pitagoreanos, primários)"
  33. mapM_ putStrLn $ resultado n mostrar
  34. where
  35. resultado n mst = map (\x -> let res = pitag x in show x ++ " -> " ++
  36. show (length $ res, length . filter (\(a, _, _, _) -> a == True) $ res) ++
  37. (if mst /= 0 then "\n" ++ (concat . map ((" * " ++) . (++ "\n") . show) $ res) else [])) $ n
Success #stdin #stdout 0.01s 5808KB
stdin
2
[100, 50]
0
stdout
1 = Introduzir um perímetro máximo
2 = Introduzir lista de perímetros
Lista de perímetros máximos? (e.g., "[50, 100, 24]"):
Mostrar trios? (0 = NÃO, outro = SIM)
Perímetro -> (pitagoreanos, primários)
100 -> (17,7)
50 -> (6,3)