mirror of
https://codeberg.org/JasterV/aoc2024-haskell.git
synced 2026-04-26 18:10:05 +00:00
day6 part one
This commit is contained in:
parent
53c6d3f68f
commit
68a1641121
5 changed files with 234 additions and 7 deletions
|
|
@ -25,12 +25,13 @@ source-repository head
|
||||||
|
|
||||||
library
|
library
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
|
Data.Matrix
|
||||||
Day1
|
Day1
|
||||||
Day2
|
Day2
|
||||||
Day3
|
Day3
|
||||||
Day4
|
Day4
|
||||||
Day4.Matrix
|
|
||||||
Day5
|
Day5
|
||||||
|
Day6
|
||||||
other-modules:
|
other-modules:
|
||||||
Paths_aoc2024
|
Paths_aoc2024
|
||||||
autogen-modules:
|
autogen-modules:
|
||||||
|
|
|
||||||
130
input/day6.txt
Normal file
130
input/day6.txt
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
.....#..#................#...#.....#.......................................................#.............................##.......
|
||||||
|
......................#..............................................................#..............#..........................#..
|
||||||
|
.........#........................#.....................................................#..............#...........#........##....
|
||||||
|
..........#......................#.....#...#............#..........................#.....#........................................
|
||||||
|
#....................................................................................................................#............
|
||||||
|
.#....#......................#.......................#...............................#...#.....#...................#........#.....
|
||||||
|
..#..#.......................##........#...............................................................#........#.........#.......
|
||||||
|
..............................................................#...#.........#..#..................................................
|
||||||
|
.............####..................................#................#..#.....................................#.....#..............
|
||||||
|
..........#................#................................................#........................#.....#......................
|
||||||
|
..............................................#.........#.....................#..................#.......................#........
|
||||||
|
.........................................##..#.................................#.....#............................................
|
||||||
|
............#..#...#...............................#.#.....#...............#...............................#..............#.#.#..#
|
||||||
|
.................#..........#..#....#.....................#......................................##............#..................
|
||||||
|
.......#....#.....................#......##...................#..............#.................#........#..#......#...............
|
||||||
|
...............................................#.............#....................................................................
|
||||||
|
..............#..............................................##..................#..........................#............#........
|
||||||
|
................#.......................#..#............................................................#..........#..#.........#.
|
||||||
|
.#.......................###............#.........#.................................................#.............................
|
||||||
|
........#......................................................................................#.....#.......#...#................
|
||||||
|
#.#.........................#..#.............................................#....#........................#......................
|
||||||
|
.......#.....#...............................#.....#......................#.................................#.....#...#...........
|
||||||
|
................................................................................................#............#....................
|
||||||
|
.......#......#...............#...#............................#................................#................................#
|
||||||
|
.#.....................................................................................................................#......#...
|
||||||
|
...........#..........................................#........#...................#..............................................
|
||||||
|
....#......................................................................................#.....##.#...................#.........
|
||||||
|
...#..........................................................................##.......................................#.....#....
|
||||||
|
#........#................#...............#.........#..#.#..............##..............#........#............#....#.....#........
|
||||||
|
......#......................................#...............#....#..#...........................#................................
|
||||||
|
#..............................................................................#............#...#..#....................#......#..
|
||||||
|
.......#.........................................#.........#.......#....................................#.........................
|
||||||
|
......#......#.............................................#.....................#...........#.............#..#...................
|
||||||
|
#.......................#........#............................................##..............................#...................
|
||||||
|
..........................................................................#........................................#....#......#..
|
||||||
|
..........#..#...............................................#............................#.#..............................#......
|
||||||
|
....#...........#..#...................................#................................................................#.........
|
||||||
|
..............#..........#...............#....#.....................................#.......................#.....................
|
||||||
|
.............#........#....#.........#...............#.........#..................................................................
|
||||||
|
.#......#...................#.......#...........................................................................#.............#...
|
||||||
|
.............##...........#.........................................#......................#.......................#..............
|
||||||
|
.....#................#.....#...................##.......#......#...........#.......#............................................#
|
||||||
|
.#..#.............................................................#..............................................#................
|
||||||
|
...#......#............................#..........................................................................................
|
||||||
|
...................................................................................#..............................................
|
||||||
|
#...................................#...................##..................#...............................................#.....
|
||||||
|
................#.....#...........................#...............................................................................
|
||||||
|
.................................#............#........................................................#.............#............
|
||||||
|
..................#......#........................................................#..^.....#......................................
|
||||||
|
..#.....#.................................................#........#.........................................................#..#.
|
||||||
|
................#..............................#....................................................#.............................
|
||||||
|
................#....#..........................................#............................#....................................
|
||||||
|
...............#.......................................#.....................................#..............................#.....
|
||||||
|
..................................................#............#..............#........##.#.....................................#.
|
||||||
|
.#..................................#......#..#............#.................#.............#......#..#.......................#....
|
||||||
|
..................#..............................#..........................#..........................##............#.......#....
|
||||||
|
.........#..................................................................#...................#..........................#......
|
||||||
|
................#....................................#............#............................................................#..
|
||||||
|
..##..........#.#..#........................#....#.................................#.............................................#
|
||||||
|
............................................#.........................................................#..#...................#...#
|
||||||
|
.......................................#......................................................................#...................
|
||||||
|
....#.......................#...#.........................................................................#................#......
|
||||||
|
...........#...........#............#.....#...#...................#........................................#.................##...
|
||||||
|
....#...........................................................................................#.................................
|
||||||
|
..............................................................................#.#.............................................#...
|
||||||
|
.........#..#..............................................#......................................................................
|
||||||
|
#...................#........#............#.......#.....................#................#.#.#............#..................#....
|
||||||
|
.......................#................#.....#...........#.....................#...........................#..........#.........#
|
||||||
|
........................................................................#.#.....................#.................................
|
||||||
|
...#.................................................#..........................#........#.......................#................
|
||||||
|
............................#...........#.......#.................................#.##...........#............................#...
|
||||||
|
...##.....................................#.........................#...........#...................................#.............
|
||||||
|
#.#..#................................#.........#..#.#..........#......................#............#......................#......
|
||||||
|
....#.............................................................#...............................................................
|
||||||
|
...............#.#......#........................................................................#.........................#......
|
||||||
|
................#.....#...#...............#.........................................#....#...........................#.......#....
|
||||||
|
...............#.........................................................................#........................................
|
||||||
|
..........................#..##...................................................................................................
|
||||||
|
.##....................#..#.....................#..............................................#........................#.........
|
||||||
|
............................................................................................#............#........................
|
||||||
|
#...................#...#......................#...............#............#....................................#................
|
||||||
|
...........................#........#......................................................................#......................
|
||||||
|
................................#...#...#.#.......#.................#.......#................##...................................
|
||||||
|
........................#.......................#.................................................................................
|
||||||
|
#...#...............#.........................................................................#.......................#...........
|
||||||
|
.........#...................#...............................................#...................##..............................#
|
||||||
|
.....#............................................................................................................................
|
||||||
|
.#.......#...............................................................#.......................#................#..........#....
|
||||||
|
....................................#..........#......#...........................................................#.#.#..#...#....
|
||||||
|
......................#..............................................##..................#........................................
|
||||||
|
....#......#...................#................#..............................................................................#..
|
||||||
|
...........#.................##.#...................................................#..#................#.........................
|
||||||
|
......#.....#......#...#........#.....................................#....#...........#................#..........#..............
|
||||||
|
#.......##.....#........#...........................................#...#..........#.............#........#.......#...............
|
||||||
|
......................#......#...................#.........................#........................#..................#...#......
|
||||||
|
.....#...........#...#.........................##.......#.....................................#...................................
|
||||||
|
....................................................................#.............................................................
|
||||||
|
........#...............#.........................................................................................................
|
||||||
|
.......................#.........................#..........................................#.#....#..#....#......................
|
||||||
|
........................##............................................................#.....#.........#....#......#..#............
|
||||||
|
........................#........#..................#................#.#.##............#..........................................
|
||||||
|
.......................................................#.........................#...............##...................##....#...#.
|
||||||
|
........#...#.............#...........#........#......................#...#.........#..#..................#.#............#........
|
||||||
|
#.#....................#..........................................#...................................................#........#..
|
||||||
|
...............................................#............#.....#.#...........#........#.#....................................#.
|
||||||
|
......#..........................................#............................................................#..........#...#...#
|
||||||
|
....................#......................................#....#..............................#....................#.............
|
||||||
|
......................#.#.....#......#....#..#....................................................................................
|
||||||
|
.....#..........................................#.........#...................................#................#.......#..........
|
||||||
|
........##....................................................................#...................................#.............#.
|
||||||
|
#.........................................#..#....#................#.#.....#....................#............................#....
|
||||||
|
#....#..#..........#..................#......................#....................................................................
|
||||||
|
...................#..#....#...................#...........................#.#..#............#......#................#.......#.#..
|
||||||
|
...............#......................................................#......#..#..............#.....................#............
|
||||||
|
............#.....................#.........#....#...............#.......#...#...............#.......................##.#.........
|
||||||
|
....#............#..................#....#.......................#..............................................#...#.............
|
||||||
|
..........................................#....#..........#..#....................#......#......................#...#.............
|
||||||
|
............#..........#...........#......#..#......................................................................#.............
|
||||||
|
...#.................#.............................................................#..............................................
|
||||||
|
.....#.#.........#....................................................#..................#...............#........................
|
||||||
|
..#......................##.....#.........#..............#..#............#..#............................................#........
|
||||||
|
...................#.....#.........#........#....................#..................................#................#............
|
||||||
|
....#.............................#.............................#.......................#.......................#.....#...........
|
||||||
|
...#......#....#...........#............................#.....#........#......#...................................................
|
||||||
|
........#..........#............................#..#..#.......................................#....#.##...........................
|
||||||
|
.......#......##........#.................#.............................................................#....#........#...........
|
||||||
|
.....................#............................................#.#......#.....##....#........#.................................
|
||||||
|
...........#.....................##.#....#..#.....................................................................................
|
||||||
|
....................#......#................................#.....................................................#.......#..#....
|
||||||
|
.....................................................#.........#.......................................#.....##..#................
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
|
||||||
module Day4.Matrix
|
module Data.Matrix
|
||||||
( Matrix,
|
( Matrix,
|
||||||
|
Position,
|
||||||
buildMatrix,
|
buildMatrix,
|
||||||
groupWith,
|
groupWith,
|
||||||
|
lookupValue,
|
||||||
lookup,
|
lookup,
|
||||||
lookupMultiple,
|
lookupMultiple,
|
||||||
filterWithKey,
|
filterWithKey,
|
||||||
|
|
@ -13,6 +15,7 @@ module Day4.Matrix
|
||||||
where
|
where
|
||||||
|
|
||||||
import qualified Data.IntMap.Lazy as IntMap
|
import qualified Data.IntMap.Lazy as IntMap
|
||||||
|
import Data.List (find)
|
||||||
import Data.Map.Lazy (Map)
|
import Data.Map.Lazy (Map)
|
||||||
import qualified Data.Map.Lazy as Map
|
import qualified Data.Map.Lazy as Map
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
|
@ -20,6 +23,8 @@ import Prelude hiding (lookup)
|
||||||
|
|
||||||
newtype Matrix v = Matrix (Map (Int, Int) v)
|
newtype Matrix v = Matrix (Map (Int, Int) v)
|
||||||
|
|
||||||
|
type Position = (Int, Int)
|
||||||
|
|
||||||
buildMatrix :: [[a]] -> Matrix a
|
buildMatrix :: [[a]] -> Matrix a
|
||||||
buildMatrix xs = Matrix (go xs 0 Map.empty)
|
buildMatrix xs = Matrix (go xs 0 Map.empty)
|
||||||
where
|
where
|
||||||
|
|
@ -36,21 +41,31 @@ buildMatrix xs = Matrix (go xs 0 Map.empty)
|
||||||
size :: Matrix v -> Int
|
size :: Matrix v -> Int
|
||||||
size (Matrix hmap) = Map.size hmap
|
size (Matrix hmap) = Map.size hmap
|
||||||
|
|
||||||
filterWithKey :: ((Int, Int) -> v -> Bool) -> Matrix v -> Matrix v
|
filterWithKey :: (Position -> v -> Bool) -> Matrix v -> Matrix v
|
||||||
filterWithKey f (Matrix hmap) = Matrix (Map.filterWithKey f hmap)
|
filterWithKey f (Matrix hmap) = Matrix (Map.filterWithKey f hmap)
|
||||||
|
|
||||||
lookup :: (Int, Int) -> Matrix v -> Maybe v
|
lookup :: Position -> Matrix v -> Maybe v
|
||||||
lookup position (Matrix hmap) = Map.lookup position hmap
|
lookup position (Matrix hmap) = Map.lookup position hmap
|
||||||
|
|
||||||
lookupMultiple :: [(Int, Int)] -> Matrix v -> [v]
|
lookupMultiple :: [Position] -> Matrix v -> [v]
|
||||||
lookupMultiple positions matrix = mapMaybe (`lookup` matrix) positions
|
lookupMultiple positions matrix = mapMaybe (`lookup` matrix) positions
|
||||||
|
|
||||||
|
{--
|
||||||
|
Search for the given value on the matrix.
|
||||||
|
Return the position of the first match if found and nothing if it doens't exist.
|
||||||
|
--}
|
||||||
|
lookupValue :: (Eq v) => v -> Matrix v -> Maybe Position
|
||||||
|
lookupValue v (Matrix hmap) =
|
||||||
|
let entries = Map.toAscList hmap
|
||||||
|
mEntry = find ((== v) . snd) entries
|
||||||
|
in fst <$> mEntry
|
||||||
|
|
||||||
{--
|
{--
|
||||||
Given a matrix of elements and a function mapping a position into an aggregation of its values,
|
Given a matrix of elements and a function mapping a position into an aggregation of its values,
|
||||||
group the elements by the aggregation result.
|
group the elements by the aggregation result.
|
||||||
The values are grouped in order.
|
The values are grouped in order.
|
||||||
--}
|
--}
|
||||||
groupWith :: forall v. ((Int, Int) -> Int) -> Matrix v -> [[v]]
|
groupWith :: forall v. (Position -> Int) -> Matrix v -> [[v]]
|
||||||
groupWith f (Matrix hmap) =
|
groupWith f (Matrix hmap) =
|
||||||
let sortedEntries = Map.toAscList hmap
|
let sortedEntries = Map.toAscList hmap
|
||||||
intMap = foldr (\(position, value) -> insertValue (f position) value) IntMap.empty sortedEntries
|
intMap = foldr (\(position, value) -> insertValue (f position) value) IntMap.empty sortedEntries
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
module Day4 (partOne, partTwo) where
|
module Day4 (partOne, partTwo) where
|
||||||
|
|
||||||
import Data.List (sort, transpose)
|
import Data.List (sort, transpose)
|
||||||
import qualified Day4.Matrix as M
|
import qualified Data.Matrix as M
|
||||||
|
|
||||||
partOne :: String -> Int
|
partOne :: String -> Int
|
||||||
partOne input =
|
partOne input =
|
||||||
|
|
|
||||||
81
src/Day6.hs
Normal file
81
src/Day6.hs
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
module Day6 (partOne, partTwo) where
|
||||||
|
|
||||||
|
import Data.HashSet (HashSet)
|
||||||
|
import qualified Data.HashSet as HashSet
|
||||||
|
import Data.Matrix (Matrix, Position)
|
||||||
|
import qualified Data.Matrix as M
|
||||||
|
import Data.Maybe
|
||||||
|
import Prelude hiding (Left, Right)
|
||||||
|
|
||||||
|
data Error = StartingPositionNotFound
|
||||||
|
deriving (Show)
|
||||||
|
|
||||||
|
partOne :: String -> Maybe Int
|
||||||
|
partOne input = length <$> predictGuardsRoute (parseLabMap input)
|
||||||
|
|
||||||
|
partTwo :: String -> Int
|
||||||
|
partTwo _input = 0
|
||||||
|
|
||||||
|
-- Laboratory Map
|
||||||
|
--
|
||||||
|
type LabMap = Matrix Char
|
||||||
|
|
||||||
|
type Direction = Char
|
||||||
|
|
||||||
|
type Guard = (Position, Direction)
|
||||||
|
|
||||||
|
type Visited = HashSet (Position, Direction)
|
||||||
|
|
||||||
|
parseLabMap :: String -> LabMap
|
||||||
|
parseLabMap = M.buildMatrix . lines
|
||||||
|
|
||||||
|
findGuard :: LabMap -> Maybe Guard
|
||||||
|
findGuard matrix =
|
||||||
|
let mUp = M.lookupValue '^' matrix
|
||||||
|
mDown = M.lookupValue 'v' matrix
|
||||||
|
mRight = M.lookupValue '>' matrix
|
||||||
|
mLeft = M.lookupValue '<' matrix
|
||||||
|
in case [mUp, mDown, mRight, mLeft] of
|
||||||
|
[Just pos, _, _, _] -> Just (pos, '^')
|
||||||
|
[_, Just pos, _, _] -> Just (pos, 'v')
|
||||||
|
[_, _, Just pos, _] -> Just (pos, '>')
|
||||||
|
[_, _, _, Just pos] -> Just (pos, '<')
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
|
predictGuardsRoute :: LabMap -> Maybe [Position]
|
||||||
|
predictGuardsRoute labMap = do
|
||||||
|
guard <- findGuard labMap
|
||||||
|
return (go guard HashSet.empty HashSet.empty)
|
||||||
|
where
|
||||||
|
go :: Guard -> Visited -> HashSet Position -> [Position]
|
||||||
|
go guard@(position, _) visited acc =
|
||||||
|
let guard' = moveGuard guard
|
||||||
|
acc' = HashSet.insert position acc
|
||||||
|
visited' = HashSet.insert guard visited
|
||||||
|
in -- If we have hit a loop or if the guard can't move anymore, finish prediction
|
||||||
|
if HashSet.member guard visited || guard == guard'
|
||||||
|
then HashSet.toList acc'
|
||||||
|
else go guard' visited' acc'
|
||||||
|
|
||||||
|
moveGuard :: Guard -> Guard
|
||||||
|
moveGuard guard =
|
||||||
|
let guard'@(position', _) = moveForward guard
|
||||||
|
mObstacle = M.lookup position' labMap
|
||||||
|
in case mObstacle of
|
||||||
|
Nothing -> guard
|
||||||
|
Just '#' -> turnRight guard
|
||||||
|
Just _ -> guard'
|
||||||
|
|
||||||
|
moveForward :: Guard -> Guard
|
||||||
|
moveForward ((row, col), '^') = ((row - 1, col), '^')
|
||||||
|
moveForward ((row, col), 'v') = ((row + 1, col), 'v')
|
||||||
|
moveForward ((row, col), '>') = ((row, col + 1), '>')
|
||||||
|
moveForward ((row, col), '<') = ((row, col - 1), '<')
|
||||||
|
moveForward guard = guard
|
||||||
|
|
||||||
|
turnRight :: Guard -> Guard
|
||||||
|
turnRight (pos, '^') = (pos, '>')
|
||||||
|
turnRight (pos, '>') = (pos, 'v')
|
||||||
|
turnRight (pos, 'v') = (pos, '<')
|
||||||
|
turnRight (pos, '<') = (pos, '^')
|
||||||
|
turnRight guard = guard
|
||||||
Loading…
Reference in a new issue