import Data.List.Split import Data.Char import Data.Maybe (catMaybes) main :: IO () main = do input <- readFile "input" let ls = lines input -- print $ part1 ls print $ part2 ls part1 ls = let eqs = map (map readVec . take 3) . chunksOf 4 $ ls solutions = catMaybes $ map solve2x3 eqs in sum $ map (\(a,b) -> 3*a + b) solutions part2 ls = let eqs = map (fixEqn . (map readVec . take 3)) . chunksOf 4 $ ls solutions = catMaybes $ map solve2x3 eqs in sum $ map (\(a,b) -> 3*a + b) solutions fixEqn [a, b, (c1,c2)] = [a, b, (c1+10000000000000, c2+10000000000000)] -- solve system of linear equations solve2x3 [(a1,a2), (b1,b2), (c1,c2)] = let det = a1*b2 - a2*b1 m1 = c1*b2 - c2*b1 m2 = c2*a1 - c1*a2 x = m1 `div` det y = m2 `div` det in if a1*x + b1*y == c1 && a2*x + b2*y == c2 then Just (x,y) else Nothing readVec line = toPair . map readInt . words . filter (\c -> isDigit c || c == ' ') $ line toPair [a,b] = (a,b) readInt :: String -> Int readInt = read