From 42523f2455fb30181efc29e3a47799283b05fa80 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 11 Dec 2020 15:49:03 +0530 Subject: add initial solution to day11 --- aoc.cabal | 10 ++++-- execs/Day10.hs | 4 +-- execs/Day11.hs | 48 +++++++++++++++++++++++++++++ input/11 | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ input/11sample | 10 ++++++ input/11sample2 | 9 ++++++ lib/Utils.hs | 44 +++++++++++++++++---------- 7 files changed, 198 insertions(+), 21 deletions(-) create mode 100644 execs/Day11.hs create mode 100644 input/11 create mode 100644 input/11sample create mode 100644 input/11sample2 diff --git a/aoc.cabal b/aoc.cabal index bcb8d8c..cd5d039 100644 --- a/aoc.cabal +++ b/aoc.cabal @@ -19,8 +19,8 @@ extra-source-files: CHANGELOG.md library hs-source-dirs: lib default-language: Haskell2010 - build-depends: base - exposed-modules: Utils + build-depends: base, containers + exposed-modules: Utils executable Day01 main-is: Day01.hs @@ -81,3 +81,9 @@ executable Day10 build-depends: base, aoc, containers, monad-memo default-language: Haskell2010 hs-source-dirs: execs + +executable Day11 + main-is: Day11.hs + build-depends: base, aoc, containers + default-language: Haskell2010 + hs-source-dirs: execs diff --git a/execs/Day10.hs b/execs/Day10.hs index c42a550..40d3d61 100644 --- a/execs/Day10.hs +++ b/execs/Day10.hs @@ -16,9 +16,7 @@ diffs s = product $ ($ q s) <$> [howMany (==1), howMany (==3)] combos top s = startEvalMemo $ go 0 where go c | c == top = return 1 - | otherwise = do - let cs = filter (`elem` s) $ map (+c) [1,2,3] - sum <$> mapM (memo go) cs + | otherwise = sum <$> mapM (memo go) (filter (`elem` s) $ map (+c) [1,2,3]) main :: IO () main = do diff --git a/execs/Day11.hs b/execs/Day11.hs new file mode 100644 index 0000000..e2f138b --- /dev/null +++ b/execs/Day11.hs @@ -0,0 +1,48 @@ +module Main where + +import Utils +import Data.List (sortOn) +import Data.Map (Map, (!)) +import qualified Data.Map as Map +import Data.Maybe + +dirs = [ (-1,-1), (0,-1), (1,-1) + , (-1, 0), (1, 0) + , (-1, 1), (0, 1), (1, 1) + ] + +adjs1 m pt = howMany (== '#') $ mapMaybe ((`Map.lookup` m) . add pt) dirs + +inGrid (x, y) w h = x < w && x >= 0 && y < h && y >= 0 +adjs2 grid pt w h = howMany ((== '#') . head) + $ filter (not . null) + $ map (dropWhile (== '.') + . map (grid !) + . takeWhile (inside (0, 0) (w-1, h-1)) + . map ($ pt) + . repeatF + . add) + dirs + +rule1 w h m pt@(x, y) = if as == 0 then '#' else 'L' + where as = adjs2 m pt w h + +rule2 w h m pt@(x, y) = if as >= 5 then 'L' else '#' + where as = adjs2 m pt w h + +doStep w h m = Map.mapWithKey fn m + where fn k 'L' = rule1 w h m k + fn k '#' = rule2 w h m k + fn k '.' = '.' + +stepWhile prev w h + | prev == next = next + | otherwise = stepWhile next w h + where next = doStep w h prev + +main :: IO () +main = do + n <- readFile "input/11" + let (grid, width, height) = makeGrid n + let solve1 = stepWhile grid width height + print $ howMany ((== '#') . snd) $ Map.toList solve1 diff --git a/input/11 b/input/11 new file mode 100644 index 0000000..5a109fd --- /dev/null +++ b/input/11 @@ -0,0 +1,94 @@ +LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LL.L.LLLL.LLLLLLLLL.LLLLL +LLLLLLLL.LLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLL..LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLL.LLLLL +LLL.LL.LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLL..LL +LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LL.LLLLLLLLL.LLLLLLLLL..LLLL +LLLLLLLLLLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL..LL..LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL +LLLLLLLLLLLLLLLLL.LLL.L.LLLLLLLL.LLLLLLLLL.LLLL.LLLL..LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLL +.L........L.L.....L.L........LL...LLL....L.LL..LL..LL..LLLL.LL...........LL.LL..L..LL....L.L +LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLL.L..LLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLL.LL.LLL.LLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LL.LLLL.LLLLL +LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLL +.............LLL...LL...L...LL...L...LL..........L.LLLLLL..L.L..L..LL..LLL.......L......L... +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLL..LLLLLLLLL.LLLLLLLLL.LLL.LLLL.LLLLLLLLL.LLLL.LLLLL +LLLLLLLLLLLL.L.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLL. +LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLL.LLLLL.LLLL.LL.LLLL.LLLLLLLLL.LLLLLLLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLL.LLLLL +LL...L.L....LL..L.........L...L....LLL......L.L..L..L...L........L..LLL.....L.LL.LL..LL..L.. +LLLLLL.LLLLL.LLLLL.LLLL.LL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLL +LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLL.LLL.L.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LL.LLLLLLL.LLLL.LLLLLLLLL..LLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL +...L.....L.L....L.LL...L..LLLL.L...L..L......L...L.L.L...L..L...LL.....L.L..L..L.L.L.....L.. +LLLLLL.LLLLL.LLLL.LLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +.LLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LL.LLLL.LLLL.LLLL.LLLL.LLLL.L.LLL +LLLLLL.LLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLL.LLLL..LLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL..LLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLLLLLL..LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLL +LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLLL.L +LL.L...LL....L..L.L..LL.....L.......L.LL...L.LLLL..L...............L.L..L.L...L..L..L..L.... +LLLLLL.LLLLLLLLLL.L.LLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLL..LLLLLLLLL.LL..L.LLLLLLL.LLLL.LLLL.LLLL.LLLL..LLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLL +LLLLLL.LLLLL.LLLLLLLLLL.LLL.LLLL.LLLLL.LLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLL.LLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LLLLL.LLLL.L.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL +.LL...LL...L...L..L..........L..L.L..L...LL......LL......L.......LL.LL..L...LLL.......LLLL.. +LLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL...LLLL.LLLLLLL.LLLL..LLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.L..LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLLLLLLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLLLLLLL.LLLLL +LLLLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.L.LLLL.LLLLLLLLL.LL.LLLLLLL +LLLLLL.LLLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLL.L.LLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLL.L.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLL..LLLLLLLLLL +LLLLLLLLLLLL.LLLL.LL.LL.LLLLLLLLLLL.LLLL.L.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLL.LL.LL +LLLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +.L.........L.L...L.....L..LL..LLL.L........L.LL.....L...L.....LL.....LLL....LLLL.L.L......L. +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.L.LL.LLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLL.L +LLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLL +....LL.L..L....L..L.L.....L...L..LL....LLL..L.....L.L.....L.LL...L.LLL.LL.....LL..LLL....L.L +LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +.LLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL..LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLL +LLLLLLLL.LLL.LLLLLLL.LL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL +..L...LL.L.......L..L...L.L.L..L.L.LL...L....LLL.....L.......L...LL......L.LL...L.L...L..... +LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLL.LLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL +LLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLLLLL.L.LLLLL +LLLLLL..LLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LL.LLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLL.LL.L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +..L..L..LL..L...L....L.....LL.....LL..........L...L.L....L.........L......LL.....L.LL...LL.. +LLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLL.LLL..LLLLL +LLLLLL.L.LLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL +LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLL +LLLLLL.LLLLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLL +LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.L.LLL.LLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLL +.LL.L.L.L.LL.....L.L.LL....L..L.............L...L.L...LLL.LL.L..L........L.....L.LL..L..L... +LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLLL.LLLL.LLLLLLLLLL +LLLLLL.LLLLL.LL.LLL.LLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLL.L.LLLLLLL.LLLLL +L.LLLL.LL.LL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLL..LLLL +LLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLL +LLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLL.LLLLL +LL.LLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLL..LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLL.LLLL.LLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LL.LLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLL diff --git a/input/11sample b/input/11sample new file mode 100644 index 0000000..1beaede --- /dev/null +++ b/input/11sample @@ -0,0 +1,10 @@ +L.LL.LL.LL +LLLLLLL.LL +L.L.L..L.. +LLLL.LL.LL +L.LL.LL.LL +L.LLLLL.LL +..L.L..... +LLLLLLLLLL +L.LLLLLL.L +L.LLLLL.LL diff --git a/input/11sample2 b/input/11sample2 new file mode 100644 index 0000000..a486e35 --- /dev/null +++ b/input/11sample2 @@ -0,0 +1,9 @@ +.......#. +...#..... +.#....... +......... +..#L....# +....#.... +......... +#........ +...#..... diff --git a/lib/Utils.hs b/lib/Utils.hs index 61c4e49..6358230 100644 --- a/lib/Utils.hs +++ b/lib/Utils.hs @@ -1,19 +1,11 @@ -module Utils ( binaryToInt - , countElem - , xor - , right - , bet - , (&+) - , howMany - , sublists - , windows - ) where - -import Data.Char (digitToInt) -import Control.Monad -import Data.Either -import Data.List (inits, tails) +module Utils where +import Data.Char (digitToInt) +import Control.Monad +import Data.Either +import Data.List (inits, tails) +import Data.Map (Map) +import qualified Data.Map as Map binaryToInt :: String -> Int binaryToInt = foldl (\a x -> a * 2 + digitToInt x) 0 @@ -28,13 +20,16 @@ right :: Either a b -> b right (Right b) = b right _ = undefined -bet :: Int -> (Int, Int) -> Bool bet k (l, u) = k >= l && k <= u +bet' k (l, u) = k > l && k < u -- combine filter predicates (&+) :: (a -> Bool) -> (a -> Bool) -> (a -> Bool) (&+) = liftM2 (&&) +(|+) :: (a -> Bool) -> (a -> Bool) -> (a -> Bool) +(|+) = liftM2 (||) + howMany :: (a -> Bool) -> [a] -> Int howMany predicate = length . filter predicate @@ -49,3 +44,20 @@ kadane = go 0 0 where go :: Int -> Int -> [Int] -> Int go best _ [] = best go best current (l:ls) = go (max best (current + l)) (max current (current + l)) ls + +-- tuple stuff + +add (x, y) (a, b) = (x+a, y+b) +shear c (x, y) = (c * x, c * y) +inside (p, q) (r, s) (a, b) = bet a (p, r) && bet b (q, s) +inside' (p, q) (r, s) (a, b) = bet' a (p, r) && bet' b (q, s) + +-- [f, f.f, f.f.f, ...] +repeatF f = f : map (f .) (repeatF f) + +makeGrid :: String -> (Map (Int, Int) Char, Int, Int) +makeGrid s = (grid, width, height) where + rows = lines s + grid = Map.fromList [((x, y), a) | (y, row) <- zip [0..] rows , (x, a) <- zip [0..] row] + width = length (head rows) + height = length rows -- cgit v1.2.3