--- /dev/null
+module Main(main) where
+
+import Data.List (transpose, sort)
+import Data.List.Split (splitOn, chunksOf)
+
+type Triple = [Integer]
+
+main :: IO ()
+main = do
+ instrText <- readFile "data/advent03.txt"
+ let triangles = map (parseLine) $ lines instrText
+ part1 triangles
+ part2 triangles
+
+
+part1 :: [Triple] -> IO ()
+part1 triangles = do
+ print $ length $ filter (validTriangle) triangles
+
+part2 :: [Triple] -> IO ()
+part2 triangles = do
+ print $ length $ filter (validTriangle) $ byColumns triangles
+
+
+parseLine :: String -> Triple
+parseLine = map (read) . filter (not . null) . splitOn " "
+
+validTriangle :: Triple -> Bool
+validTriangle triple = sortedTriple!!0 + sortedTriple!!1 > sortedTriple!!2
+ where sortedTriple = sort triple
+
+byColumns :: [[Integer]] -> [Triple]
+byColumns = chunksOf 3 . concat . transpose