3 | import Data.List.Lazy
10 | numbers: List Integer
14 | show (MkTest test_value numbers) =
15 | let numbers = joinBy " " . map show $
numbers
16 | in "\{show test_value}: \{numbers}"
19 | Operator = Integer -> Integer -> Integer
21 | checkTest : (operators : LazyList Operator) -> Test -> Bool
22 | checkTest operators (MkTest test_value numbers) =
23 | Data.List.Lazy.any (== test_value) $
allCombinations operators (fromList numbers)
25 | allCombinations : (ops : LazyList Operator) -> LazyList Integer -> LazyList Integer
26 | allCombinations ops [] = []
27 | allCombinations ops (x :: []) = [x]
28 | allCombinations ops (x :: y :: xs) = do
33 | else allCombinations ops (z :: xs)
35 | totalPossiblyTrue : (ops : LazyList Operator) -> List Test -> Integer
36 | totalPossiblyTrue ops tests =
37 | sum . map test_value . filter (checkTest ops) $
tests
39 | parseTest : String -> Maybe Test
41 | case split (== ':') $
str of
42 | (test_value ::: [rest]) => do
43 | test_value <- parseInteger test_value
44 | numbers <- traverse parseInteger . forget . split (== ' ') . trim $
rest
45 | Just $
MkTest test_value numbers
48 | parseInput : String -> Maybe (List Test)
50 | let strs = map trim . lines $
str
51 | in traverse parseTest strs
54 | part1 : String -> IO (String, List Test)
56 | Just input <- pure $
parseInput str
58 | putStrLn "Failed parsing input"
60 | let out = totalPossiblyTrue [(+), (*)] input
61 | pure (show out, input)
64 | part2 : List Test -> String -> IO String
66 | pure . show . totalPossiblyTrue [(+), (*), concatOp] $
tests
68 | concatOp : Integer -> Integer -> Integer
71 | let k = (show i) ++ (show j)
72 | in case parseInteger k of
73 | Nothing => assert_total (idris_crash "ummm???")