2015 Day 16 in Haskell
This commit is contained in:
parent
10764fdb1b
commit
80b4cc3cff
48
2015/day16/day16.hs
Normal file
48
2015/day16/day16.hs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import Aoc
|
||||||
|
import Data.List.Split ( splitOn )
|
||||||
|
import Data.Char ( isDigit )
|
||||||
|
import Control.Arrow ( second )
|
||||||
|
import Data.Maybe ( fromMaybe )
|
||||||
|
|
||||||
|
parseLine :: String -> (Int, [(String, Int)])
|
||||||
|
parseLine line =
|
||||||
|
let ("Sue ", rest0) = splitAt 4 line in
|
||||||
|
let (n, rest1) = span isDigit rest0 in
|
||||||
|
let (':':' ':rest2) = rest1 in
|
||||||
|
let items = splitOn ", " rest2 in
|
||||||
|
(read n, map (second read . pair . splitOn ": ") items)
|
||||||
|
|
||||||
|
tape :: [(String, Int)]
|
||||||
|
tape = [
|
||||||
|
("children", 3),
|
||||||
|
("cats", 7),
|
||||||
|
("samoyeds", 2),
|
||||||
|
("pomeranians", 3),
|
||||||
|
("akitas", 0),
|
||||||
|
("vizslas", 0),
|
||||||
|
("goldfish", 5),
|
||||||
|
("trees", 3),
|
||||||
|
("cars", 2),
|
||||||
|
("perfumes", 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
part1' :: (String -> Int -> Int -> Bool) -> [(Int, [(String, Int)])] -> Int
|
||||||
|
part1' predicate = fst . single . filter matches
|
||||||
|
where matches (_, items) = all itemMatches tape
|
||||||
|
where itemMatches (name, n) = case lookup name items of
|
||||||
|
Nothing -> True
|
||||||
|
Just n' -> predicate name n' n
|
||||||
|
|
||||||
|
part1 :: [(Int, [(String, Int)])] -> Int
|
||||||
|
part1 = part1' $ const (==)
|
||||||
|
|
||||||
|
part2 :: [(Int, [(String, Int)])] -> Int
|
||||||
|
part2 = part1' $ fromMaybe (==) . flip lookup [
|
||||||
|
("cats", (>)),
|
||||||
|
("trees", (>)),
|
||||||
|
("pomeranians", (<)),
|
||||||
|
("goldfish", (<))
|
||||||
|
]
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = aocMain (map parseLine) part1 part2
|
Loading…
Reference in New Issue
Block a user