Day 9 - don't bother with qsort
This commit is contained in:
@@ -34,8 +34,8 @@ area (B l r t b) = (abs (l - r) + 1) * (abs (t - b) + 1)
|
|||||||
mkbox : Point → Point → Box
|
mkbox : Point → Point → Box
|
||||||
mkbox (a,b) (c,d) = B (min a c) (max a c) (min b d) (max b d)
|
mkbox (a,b) (c,d) = B (min a c) (max a c) (min b d) (max b d)
|
||||||
|
|
||||||
boxes : List Point → List Box
|
makeBoxes : List Point → List Box
|
||||||
boxes pts = go pts Nil
|
makeBoxes pts = go pts Nil
|
||||||
where
|
where
|
||||||
go2 : Point → List Point → List Box → List Box
|
go2 : Point → List Point → List Box → List Box
|
||||||
go2 pt (x :: xs) acc = go2 pt xs (mkbox pt x :: acc)
|
go2 pt (x :: xs) acc = go2 pt xs (mkbox pt x :: acc)
|
||||||
@@ -63,8 +63,7 @@ getLines points = go points Nil
|
|||||||
|
|
||||||
-- I'm assuming the winner isn't a single row/column
|
-- I'm assuming the winner isn't a single row/column
|
||||||
part2 : List (Int × Box) → List Line → Int
|
part2 : List (Int × Box) → List Line → Int
|
||||||
part2 Nil _ = 0
|
part2 boxes lines = go boxes lines 0
|
||||||
part2 ((size, box) :: rest) lines = if checkRec box then size else part2 rest lines
|
|
||||||
where
|
where
|
||||||
winds : Box → Line → Bool
|
winds : Box → Line → Bool
|
||||||
winds (B l r t b) (VL x y1 y2) =
|
winds (B l r t b) (VL x y1 y2) =
|
||||||
@@ -77,17 +76,24 @@ part2 ((size, box) :: rest) lines = if checkRec box then size else part2 rest li
|
|||||||
let (Nothing) = find (isect box) lines | _ => False in
|
let (Nothing) = find (isect box) lines | _ => False in
|
||||||
let winding = length' $ filter (winds box) lines in mod winding 2 == 1
|
let winding = length' $ filter (winds box) lines in mod winding 2 == 1
|
||||||
|
|
||||||
|
go : List (Int × Box) → List Line → Int → Int
|
||||||
|
go Nil _ acc = acc
|
||||||
|
go ((size, box) :: rest) lines acc =
|
||||||
|
if size < acc then go rest lines acc
|
||||||
|
else if checkRec box then go rest lines size
|
||||||
|
else go rest lines acc
|
||||||
|
|
||||||
run : String -> IO Unit
|
run : String -> IO Unit
|
||||||
run fn = do
|
run fn = do
|
||||||
putStrLn fn
|
putStrLn fn
|
||||||
text <- readFile fn
|
text <- readFile fn
|
||||||
let (pts@(a :: _)) = parse text | _ => putStrLn "empty input"
|
let (pts@(a :: _)) = parse text | _ => putStrLn "empty input"
|
||||||
-- printLn pts
|
let boxes = map (\box => (area box, box)) $ makeBoxes pts
|
||||||
let sortBoxes = qsort (\ a b => fst a > fst b) $ map (\box => (area box, box)) $ boxes pts
|
let ((p1,_) :: _ ) = boxes | _ => printLn "no boxes"
|
||||||
let ((p1,_) :: _ ) = sortBoxes | _ => printLn "no boxes"
|
let x = foldl (\ acc x => if fst x > acc then fst x else acc) 0 boxes
|
||||||
putStrLn $ "part1 \{show p1}"
|
putStrLn $ "part1 \{show p1} \{show x}"
|
||||||
let vl = getLines $ a :: reverse pts
|
let vl = getLines $ a :: reverse pts
|
||||||
putStrLn $ "part2 " ++ show (part2 sortBoxes vl)
|
putStrLn $ "part2 " ++ show (part2 boxes vl)
|
||||||
|
|
||||||
main : IO Unit
|
main : IO Unit
|
||||||
main = do
|
main = do
|
||||||
|
|||||||
Reference in New Issue
Block a user