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