From: Neil Smith Date: Tue, 8 Dec 2020 10:41:54 +0000 (+0000) Subject: Done day 3 X-Git-Url: https://git.njae.me.uk/?a=commitdiff_plain;h=68043122bb8c2cc485dfa18d26e547ad73730a2e;p=advent-of-code-20.git Done day 3 --- diff --git a/advent02/src/advent02.hs b/advent02/src/advent02.hs index 27886d0..ce0eeb7 100644 --- a/advent02/src/advent02.hs +++ b/advent02/src/advent02.hs @@ -23,7 +23,6 @@ main = let policies = successfulParse text print $ part1 policies print $ part2 policies - -- print $ head $ part2 nums part1 = length . filter inRange where nCharsPresent p = length $ filter (== (character p)) (password p) @@ -56,9 +55,8 @@ passwordP = some alphaNumChar <* sc policiesP = many policyP policyP = Policy <$> integerP <* hyphenP <*> integerP <*> characterP <* colonP <*> passwordP --- policyP = (,,,) <$> integerP <* hyphenP <*> integerP <*> characterP <* colonP <*> passwordP --- successfulParse :: Text -> [Policy] +successfulParse :: Text -> [Policy] successfulParse input = case parse policiesP "input" input of Left _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err diff --git a/advent03/package.yaml b/advent03/package.yaml new file mode 100644 index 0000000..dc4d10d --- /dev/null +++ b/advent03/package.yaml @@ -0,0 +1,59 @@ +# This YAML file describes your package. Stack will automatically generate a +# Cabal file when you run `stack build`. See the hpack website for help with +# this file: . + +name: advent03 +synopsis: Advent of Code +version: '0.0.1' + +default-extensions: +- AllowAmbiguousTypes +- ApplicativeDo +- BangPatterns +- BlockArguments +- DataKinds +- DeriveFoldable +- DeriveFunctor +- DeriveGeneric +- DeriveTraversable +- EmptyCase +- FlexibleContexts +- FlexibleInstances +- FunctionalDependencies +- GADTs +- GeneralizedNewtypeDeriving +- ImplicitParams +- KindSignatures +- LambdaCase +- MonadComprehensions +- MonoLocalBinds +- MultiParamTypeClasses +- MultiWayIf +- NamedFieldPuns +- NegativeLiterals +- NumDecimals +# - OverloadedLists +- OverloadedStrings +- PartialTypeSignatures +- PatternGuards +- PatternSynonyms +- PolyKinds +- RankNTypes +- RecordWildCards +- ScopedTypeVariables +- TemplateHaskell +- TransformListComp +- TupleSections +- TypeApplications +- TypeFamilies +- TypeInType +- TypeOperators +- ViewPatterns + +executables: + advent03: + main: advent03.hs + source-dirs: src + dependencies: + - base >= 2 && < 6 + - containers diff --git a/advent03/src/advent03.hs b/advent03/src/advent03.hs new file mode 100644 index 0000000..777cf7e --- /dev/null +++ b/advent03/src/advent03.hs @@ -0,0 +1,46 @@ +-- import Debug.Trace + +import qualified Data.Set as S + +type Position = (Int, Int) +type Trees = S.Set Position + +main :: IO () +main = + do text <- readFile "data/advent03.txt" + let (trees, maxCorner) = readGrid text + -- print $ S.size trees + -- print trees + -- print $ maxCorner + -- print $ take 25 $ visitedPlaces (1, 3) maxCorner + -- print $ takeWhile (withinTrees maxCorner) $ visitedPlaces (1, 3) maxCorner + print $ part1 trees maxCorner + print $ part2 trees maxCorner + + +readGrid :: String -> (Trees, Position) +readGrid input = ( S.fromList [ (r, c) + | r <- [0..maxR], c <- [0..maxC] + , (grid!!r)!!c == '#'] + , (maxR, maxC) + ) + where grid = lines input + maxC = (length $ head grid) - 1 + maxR = (length grid) - 1 + + +part1 trees maxCorner = countEncounteredTrees trees maxCorner (1, 3) + +part2 trees maxCorner = foldr1 (*) $ map cet [(1, 1), (1, 3), (1, 5), (1, 7), (2, 1)] + where cet = countEncounteredTrees trees maxCorner + +countEncounteredTrees trees maxCorner delta = S.size $ S.intersection trees visited + where visited = S.fromList $ takeWhile (withinTrees maxCorner) $ visitedPlaces delta maxCorner + + +visitedPlaces :: Position -> Position -> [Position] +visitedPlaces (dr, dc) (_maxR, maxC) = iterate wrappingStep (0, 0) + where wrappingStep (r, c) = (r + dr, (c + dc) `mod` (maxC + 1)) + +withinTrees (maxR, maxC) (r, c) = r >= 0 && r <= maxR && c >= 0 && c <= maxC + diff --git a/data/advent03.txt b/data/advent03.txt new file mode 100644 index 0000000..d193cf2 --- /dev/null +++ b/data/advent03.txt @@ -0,0 +1,323 @@ +.#.#....##.......#..........#.. +...#...........##...#..#....... +#.####......##.#...#......#.#.. +##.....#.#.#..#.#............#. +##.....#....#.........#...##... +###..#.....#....#.............. +..........#..#.#..#.#....#..... +##.....#....#.#...#.##......... +#...#......#....##....#..#.#... +.##.##...#....##..#.#.....#...# +.....#.#..........##.#........# +.##..................#..#..##.# +#.#..........##....#.####...... +.#......#.#......#.........#... +#....#..##.##..##........#.#... +##..#.##..#...#..####.#..#..... +###....#.###.##...........##..# +.....#.##.....##.#..#####....## +....#.###....#..##....##...#... +..###.#...##.....#.##..#..#.#.. +#...#..#..#.........#..#....... +##..#.#.....#.#.#.......#...#.# +...#...##.#........#...#....... +..#..#.#..#...#...#...........# +........#.....#......#...##.... +#........##.##.#.#...#...#..... +####.......#.##.###.#....#..... +...#...........#...#......#...# +##...#...#............#.......# +....#...........##.......#..... +###......#.....#....#...#.#...# +.....##..........#.......#.#... +##.##.##...#......#....#....... +##..#.#..#......#...#..#....... +....#....##.##............####. +..#.###..#.##.###..#.##.......# +#.##..#.#.....#..#.....##...... +..##..#.....##.#.##........#... +.#..#.#......#..#............#. +.....#..#.#...#....#.##.#...... +.#...##.#..#.#...##...##..##... +###............#.#..#..#...#... +..#..##.####.#.....#.....##.### +#....#.##..##....#..#...#.##.#. +.....#.##.........##...##...... +.........####.#....#.#......#.# +.........#.#..#...#.#..#.#....# +.#.....#..##.##..##....#....... +..........##......#.##.###....# +.##...###..##.#...#........##.. +..............#.#....#.#.###.## +..##.##.......#.#......##...#.. +.#.....#..##..#.###...#..#.##.# +#.....#.#..#...#........#...#.. +.#......#....#.#.....###...#..# +..##.#....#..##......#.....#... +..#.#.##..#.....#.####..###.... +.........#......#..#........... +..#........#.##.#.....##.##..#. +.......#.........#....#...#.#.. +.##.....#.#....#.#.......#..... +..........#.##........##...##.. +###..###.#.#..#..#####.##.#.##. +..##..##.#.#...#..#.#.#......#. +#..#..#..#..##..#.....#......#. +..#....#.##..#......##......... +..#.##......#...##.#......#.... +.......#..#.##.#.....#......... +.......#.#.#.###...##......#... +.....#.#..........#..#...#..... +....##..........#..........##.. +..#......#.....#.##.#..#...#.#. +....#.....#..#...#..#.#.##..### +.####....#........#...#........ +...##.#.##.#..#...##...#.##.... +....#...#...#.#.#.#...#..#..... +.....#...#.#.....#.#........##. +..#.#.......###.#.....##....... +......#.........##....#....#..# +.............##.....##......... +.........##...##.......#.....#. +##.........#..........#.###..## +...#.....#......#....#..##..... +##..#...#...##.#.....#.#......# +..#...##.#.......#.#......#.##. +......#.......#.#...........#.. +..........#.....##............# +#........#...#..#.......###.##. +.##...........#.#........#.#.#. +...#..##...#.#....#####.#...... +.....##...###...#..#.##...####. +...#....#.....#..#.......#..... +#....#....#...#..#..#.######..# +#.###...........#......#...#..# +.#.#.#.#..#....#....#...##.#... +.#..#.........#.#....###...#... +......#..##.##..........#....## +.....#......##....##.....#...#. +.#...#.#.#....##....#..#....#.# +..................#..###.#..##. +..#.........#......#....#..###. +#.#.....#..#..#....###..###.... +..##..##.#..##........##...##.. +##..#........##..###..#.....#.# +..#..###..#......#....#...#...# +#..#.#..............##.#..#.#.. +.....####....#...####.....#.#.. +.....#....##.#......###........ +##.##...#.#.#.#.......#....##.. +.#......#...#.#....#..##.#.##.# +#.#.##.#.#......#..##........## +...##.....#.....#...#..###...#. +........###.....#.....#...##..# +.....#.##.##......#.#....#...#. +.#....##.......#..#.####....... +.#..#....#..........#......#.#. +.#.##.##.....###.#.#........... +.........#......#..##.......... +....#...##.#.#.#..#.#.........# +..#.....#.##...#..#..#.###....# +...#.##......#.....##....#..... +###............#.#....#...#.... +.......#.....#..#.#.#....#..#.# +...#......#.#..##..#....#...#.# +............##........##..##... +..#..#.##..#......###..#....... +........#.........#............ +..#...#.#########.#...##..###.. +#....#......#.......#.#.....#.. +#.#..#....###.###....#...#.#... +#...###.#.#.......#.##......#.. +.................#...#.#.#..... +##....#...#........#....#.#..#. +......#.....#...#..........#.#. +##..........#...#..........#.## +..#.#.##.#....#.#......#...##.. +.....#.......#..#.....#........ +#.##.#..##..#.......##......... +....#......#..#..#.#...#....... +...#....#................###... +.##.....#.#....#.#..........##. +...#..#....#.##.##......#...... +..#.#....#.......#.#..##....... +....#.....#..........##.#.##### +#.....................##..#..#. +.###..#.##.......##.#...#..#... +...###.......#..#...#......#..# +#..#...#.#..#.#..#..#.##....... +#...##.......#..#..#.##..###... +......#....#.#.#........#.##..# +..##..#....#....#..#.#..#...... +..##.#...#.#######..#...#.....# +..#....#..#.........#..##...... +...#....#.#......#..#..#.#..... +#..#....#........#.#..##....### +#....#..##......##.##.....#.### +...#.#..........#..#.#.#.#.##.. +......##..#.#..#.#....#....#... +##....#....#..#..#.##......#... +....#.#..##.#.#...###....##.#.. +...#.......##..#.......#...#... +......##.......#..##.....#...#. +...#.#...#...........#...#..... +.#....#...#......##.##..###..#. +.#..........#...#...#...##.##.. +.....###..#.....#..##....#.#### +..#.###..#..##..##.....#.#..... +.............#.###...##.#.....# +....###.......###.#.....#..#.#. +........##.#.........#.....###. +.....###.#..#.....#...#..#..... +.#....#..##.#..#.#....#.......# +........#......#.#..#.#..#...## +...#.##.##......#.............. +.#.....##.#.....#..#......##... +#..#..#.....#.....#.....###.... +.##...........#..#.##.....#.... +..#.#......#.#...#.##.#..#...## +...#..........#.....#.......... +#.#.#.#.#...#....#...#.....##.. +#......##...#...#..........#.#. +....##........#.#.............. +#..#.#.#..#........##......#.## +........####...##.#.....#...... +....#........#.#..#..##..#.#... +.#.....#..###...#..#.....#..#.. +#......###.#..#....#..#.#...... +....#.....##.##..#...#.#..##.#. +..##..#...#.#......#....#...#.# +#..##...##..#...###...#..#..... +.......#.....#...........##.... +#..##....#........#....##..#.#. +.#........#..##...###.#..#..... +.#.#....#..##...#...##.#..###.. +#.........#.......#.....#.#.... +#..#.....#.#.###.#..#......#... +....#..#.#....#..##..###....### +###.##.#.#..#...........#.#.#.. +..##.#.......#......#..##....#. +.....#.#.#.......##.......#...# +...........#.##....##.##....#.# +...#.......#..#.##..#......#..# +#.#.#...#......##.#...........# +##........#...........###.#..#. +..........#.#.#....#.#..##.#.#. +...#.#.#....#..........#..#.... +#.#....###.#.#..#.......###...# +.#....#......#.#.#..#..#....... +......##.............#....#.#.# +.#..........#.........#.##..... +##....#....##....#..#.......#.. +#.##.##.#..#..#.....#..#.##.#.. +.#..#.......##..#.....##.##.... +.......#..........#.#.##..#.##. +....#.....#.#...##....##....... +.......#.........#...##....##.# +#.....#......#..........#...#.. +...#.#.......#.#..#....###..#.. +.....#.#.#.........#........... +.#..###.#.#........#.#......... +.........#..#......##...##....# +...###..#.....##.....#.###....# +.##...#...#........###.#..#.... +.##........#..#.###.######.##.# +##.#...#.#....#..##.#....##.... +.......##.....##.#..###.#...... +..##...##........#.......#....# +#..##...#.####...###......#...# +.##.....#.##.#.#.....###.#..##. +..###....#.#.###.#....#........ +....#..###..#...#....#..#..#.#. +#.#.##....##...##.......#...... +.........#...#....#..#......... +.............#...#..##.#....... +...#.##.......#...#.#..##.##... +.####.#.##..#.#......#.##...#.# +.#..#.#.....#.................# +..#.##..###....#...#......####. +..##..##...........#....#...#.. +....#...#...#...#.......#....#. +#.#...###...#...#.#...#....##.# +......#...#.#.......#.....#...# +....##...#.#.#....#....#.#....# +.....#.....#...##..#...#....##. +#.....#....#......##.##....#... +...#.#....#...#....#.#....##..# +...#.#..#...##....###..#....... +...##......###...###.#...#..#.. +##.......#.......###.......#..# +..##.##..###.#............#...# +#.....##..#..##....##..#....... +......#.#...#......#.....#..... +#...........#....#..##.##.#.... +.......#..#......#...#....#...# +.#...##...........#......#...#. +#........#....##...###.#....#.. +.....#.......##.........#.##... +.#.###..#....#..##.#..#.#..#... +#.......#.##.#.#....#.#..#....# +###.....#.#.......#..#......#.# +#..#.#.......#.#..##..##.#.#... +#..#.#.#.###........#.....#...# +#.#.#..#..##.....#...........#. +..#.#..#.....#...#...#...##.... +...#.##......#...##.#...#.#.#.# +#..#.#.#.#.......####.......... +..#......#.#......##.###.....## +..#...##..#.........##....#.##. +##.##.##.#.#.....#..........##. +.#.....###.#..#....#..#.###...# +#...##.......###....#.#..#..... +..#....##.........##.........## +......#....#.##.......#........ +..#.#.#..#...#...#...##.#...#.. +......#..##.#.#.#...##...#.#.## +#..#...##.#.....#...#.##....... +..#..#.........##.#...#.##...## +##.##.#....#.......#.##..#..... +.....##...##.##...##.........## +#......#...#.......#...#...#... +...##...........#...#..#....... +.#.##.#..#........#....#....... +#.#...#..#......##...#.#.##.... +##........####..#.#...#.#.##.## +#..#.#.##......##.#.#..#....... +.....#.........#..#.####....#.. +......##..#....#...#.#....#.... +#...##........#.........#.....# +.#.#...#.#.#..#............##.# +.#..#....#....#.....#...#.....# +..###...#..#.....#.##.###...#.# +.#.###..#..#...#.#...#.#......# +#...#####......###........##... +.....#.....#..#.#....#..##..... +....##...#.#.##.#####...#....#. +.#.#.........##.#.......#..##.. +.#...#.#...#...#....#.#...##.#. +.##...#..#.#..#......#.#.#..##. +..#.....#..#.....##.....#...... +..#........#..##...#.......###. +.#....#.......#....#....#..#... +....#......#.#.#.........#..... +..##...#.#.#...#.#........#.... +.#.....####...##.#..#...##..... +...#.....#...#...#....#....#... +.........#..#.#.....#..#.#..#.. +.........##...........#.......# +......#..#.....##...#.##.#..... +.#......##........##...#.#.##.. +.....#.#..##...........#..#..#. +...#.......#...#.#..#.##..#.##. +...#.......#.....#.#...#.##.#.. +#.....#.............##.#..####. +.#...#......#...##.#....#.#.... +.##..##.##....#.#.....#.......# +...#...#....#....##.#..#....##. +..............##....#.......#.# +.#.#.#...##..#..#...###.#..#... +.#.#...#.#..#.#..#...######..#. +........#......#.#..#.#....#... +..###.....###.#.##....#...##... +.##.#.....#.......##.......#... +..#..##...#..........#.#....#.# diff --git a/data/advent03a.txt b/data/advent03a.txt new file mode 100644 index 0000000..7e88cdc --- /dev/null +++ b/data/advent03a.txt @@ -0,0 +1,11 @@ +..##....... +#...#...#.. +.#....#..#. +..#.#...#.# +.#...##..#. +..#.##..... +.#.#.#....# +.#........# +#.##...#... +#...##....# +.#..#...#.# diff --git a/problems/day03.html b/problems/day03.html new file mode 100644 index 0000000..ad12ea8 --- /dev/null +++ b/problems/day03.html @@ -0,0 +1,177 @@ + + + + +Day 3 - Advent of Code 2020 + + + + + + + +

Advent of Code

Neil Smith (AoC++) 6*

       y(2020)

+ + + +
+ +

--- Day 3: Toboggan Trajectory ---

With the toboggan login problems resolved, you set off toward the airport. While travel by toboggan might be easy, it's certainly not safe: there's very minimal steering and the area is covered in trees. You'll need to see which angles will take you near the fewest trees.

+

Due to the local geology, trees in this area only grow on exact integer coordinates in a grid. You make a map (your puzzle input) of the open squares (.) and trees (#) you can see. For example:

+
..##.......
+#...#...#..
+.#....#..#.
+..#.#...#.#
+.#...##..#.
+..#.##.....
+.#.#.#....#
+.#........#
+#.##...#...
+#...##....#
+.#..#...#.#
+
+

These aren't the only trees, though; due to something you read about once involving arboreal genetics and biome stability, the same pattern repeats to the right many times:

+
..##.........##.........##.........##.........##.........##.......  --->
+#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
+.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
+..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
+.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
+..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....  --->
+.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
+.#........#.#........#.#........#.#........#.#........#.#........#
+#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
+#...##....##...##....##...##....##...##....##...##....##...##....#
+.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#  --->
+
+

You start on the open square (.) in the top-left corner and need to reach the bottom (below the bottom-most row on your map).

+

The toboggan can only follow a few specific slopes (you opted for a cheaper model that prefers rational numbers); start by counting all the trees you would encounter for the slope right 3, down 1:

+

From your starting position at the top-left, check the position that is right 3 and down 1. Then, check the position that is right 3 and down 1 from there, and so on until you go past the bottom of the map.

+

The locations you'd check in the above example are marked here with O where there was an open square and X where there was a tree:

+
..##.........##.........##.........##.........##.........##.......  --->
+#..O#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
+.#....X..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
+..#.#...#O#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
+.#...##..#..X...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
+..#.##.......#.X#.......#.##.......#.##.......#.##.......#.##.....  --->
+.#.#.#....#.#.#.#.O..#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
+.#........#.#........X.#........#.#........#.#........#.#........#
+#.##...#...#.##...#...#.X#...#...#.##...#...#.##...#...#.##...#...
+#...##....##...##....##...#X....##...##....##...##....##...##....#
+.#..#...#.#.#..#...#.#.#..#...X.#.#..#...#.#.#..#...#.#.#..#...#.#  --->
+
+

In this example, traversing the map using this slope would cause you to encounter 7 trees.

+

Starting at the top-left corner of your map and following a slope of right 3 and down 1, how many trees would you encounter?

+
+

Your puzzle answer was 228.

--- Part Two ---

Time to check the rest of the slopes - you need to minimize the probability of a sudden arboreal stop, after all.

+

Determine the number of trees you would encounter if, for each of the following slopes, you start at the top-left corner and traverse the map all the way to the bottom:

+
    +
  • Right 1, down 1.
  • +
  • Right 3, down 1. (This is the slope you already checked.)
  • +
  • Right 5, down 1.
  • +
  • Right 7, down 1.
  • +
  • Right 1, down 2.
  • +
+

In the above example, these slopes would find 2, 7, 3, 4, and 2 tree(s) respectively; multiplied together, these produce the answer 336.

+

What do you get if you multiply together the number of trees encountered on each of the listed slopes?

+
+

Your puzzle answer was 6818112000.

Both parts of this puzzle are complete! They provide two gold stars: **

+

At this point, you should return to your Advent calendar and try another puzzle.

+

If you still want to see it, you can get your puzzle input.

+

You can also this puzzle.

+
+ + + + + + \ No newline at end of file diff --git a/stack.yaml b/stack.yaml index 5733ed4..4659b84 100644 --- a/stack.yaml +++ b/stack.yaml @@ -37,6 +37,7 @@ packages: # - . - advent01 - advent02 +- advent03 # Dependency packages to be pulled from upstream that are not in the resolver. # These entries can reference officially published versions as well as