Skip to content

Instantly share code, notes, and snippets.

@bradparker
Last active August 9, 2018 09:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bradparker/447a49aaee965b8d3aa3d6fd78720a94 to your computer and use it in GitHub Desktop.
Save bradparker/447a49aaee965b8d3aa3d6fd78720a94 to your computer and use it in GitHub Desktop.
module Main
( main
) where
import Control.Arrow ((&&&))
import Control.Monad.Trans.State (StateT(StateT), evalStateT)
import Data.List (uncons, unfoldr)
import Data.Maybe (fromMaybe, listToMaybe)
import System.Environment (getArgs)
unconses :: [a] -> [(a, [a])]
unconses = unfoldr (((id &&& snd) <$>) . uncons)
triples :: Int -> [(Int, Int, Int)]
triples =
evalStateT ((,,) <$> StateT unconses <*> StateT unconses <*> StateT unconses) .
enumFromTo 1
pythagoreans :: Int -> [(Int, Int, Int)]
pythagoreans = filter (\(a, b, c) -> a ^ 2 + b ^ 2 == c ^ 2) . triples
main :: IO ()
main = do
n <- maybe 100 read . listToMaybe <$> getArgs
mapM_ print $ pythagoreans n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment