Add solution to AoC 2023 #16a
3 files changed, 204 insertions(+), 0 deletions(-) A 2023/16.example A 2023/16.hs A 2023/16.input
A 2023/16.example => 2023/16.example +10 -0
@@ 0,0 1,10 @@ .|...\.... |.-.\..... .....|-... ........|. .......... .........\ ..../.\\.. .-.-/..|.. .|....-|.\ ..//.|....
A 2023/16.hs => 2023/16.hs +84 -0
@@ 0,0 1,84 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE NoImplicitPrelude #-} module Main where import Qulude import qualified Qulude.Grid as Grid import Qulude.Grid ( Grid(..), Pos ) --import Data.Array ( (!), (//) ) import qualified Data.Array as Array import qualified Data.Array.ST as STArray import qualified Data.Either as Either import qualified Data.List as List --import Data.Map ( (!) ) import qualified Data.Map as Map import qualified Data.Maybe as Maybe import qualified Data.Sequence as Seq import qualified Data.Set as Set data Thing = MirrorNESW | MirrorNWSE | SplitterNS | SplitterEW deriving ( Show, Eq, Ord ) type Parse = Grid Thing parser :: Parser Parse parser = Grid.parse thing where thing = char '.' $> Nothing <|> char '/' $> Just MirrorNESW <|> char '\\' $> Just MirrorNWSE <|> char '|' $> Just SplitterNS <|> char '-' $> Just SplitterEW data Direction = North | South | East | West deriving ( Show, Eq, Ord ) type Beam = (Pos, Direction) step :: Grid Thing -> Beam -> [Beam] step g (p@(x,y),d) = filter (\(p, _) -> Grid.inBounds g p) $ case (Grid.lookup g p, d) of (Nothing, North) -> [((x,y-1), d)] (Nothing, South) -> [((x,y+1), d)] (Nothing, East) -> [((x+1,y), d)] (Nothing, West) -> [((x-1,y), d)] (Just MirrorNWSE, North) -> [((x-1,y), West)] (Just MirrorNWSE, South) -> [((x+1,y), East)] (Just MirrorNWSE, East) -> [((x,y+1), South)] (Just MirrorNWSE, West) -> [((x,y-1), North)] (Just MirrorNESW, North) -> [((x+1,y), East)] (Just MirrorNESW, South) -> [((x-1,y), West)] (Just MirrorNESW, East) -> [((x,y-1), North)] (Just MirrorNESW, West) -> [((x,y+1), South)] (Just SplitterNS, North) -> [((x,y-1), d)] (Just SplitterNS, South) -> [((x,y+1), d)] (Just SplitterNS, East) -> [((x,y-1), North), ((x,y+1), South)] (Just SplitterNS, West) -> [((x,y-1), North), ((x,y+1), South)] (Just SplitterEW, North) -> [((x+1, y), East), ((x-1,y), West)] (Just SplitterEW, South) -> [((x+1, y), East), ((x-1,y), West)] (Just SplitterEW, East) -> [((x+1,y), d)] (Just SplitterEW, West) -> [((x-1,y), d)] partA :: Parse -> Int partA g = Set.size $ Set.map fst $ f Set.empty [((1,1), East)] where f vs [] = vs f vs (b:bs) = let bs' = filter (\b' -> b' `Set.notMember` vs) $ step g b in let vs' = Set.insert b vs in f vs' (bs'++bs) --partB :: Parse -> Parse --partB = id main :: IO () main = with parser $ do run' "16.example" "a example" partA 46 run' "16.input" "a input" partA 7210 --run "16.example" "b example" partB --run "16.input" "b input" partB
A 2023/16.input => 2023/16.input +110 -0
@@ 0,0 1,110 @@ \./....\../......................|............../-.......|....................|....../|\..../.............\... ...........|.-.............|.././........../........................./...........||.....................-....\ ...............\.............-...................-............/.|...|.......-...............................-. .......................................\..|-.../\....../.........|............/...|.....-.|...........\...|... ............/.-..|...\........|...........-......................\.........-........\....../....|.........|... ................-...........-|....\.................-........\........\...|.././......./...................... ......................-....../.-........../........\....../..../.............-..........|.|.................|. ...|....................|.|../.......\.......|.......-...............|.......\......\....................|\... .........\.............|.......-.....................|....................|..................-.......\-...\... .../............-........../.||..../........-...../-.........-......./......\........|........................ ....|..../.../../.....\..............-.-................../........|...../....\....\...................|...... .......\..-..................|..../..........|....................-............/...................\|../...... ..-.\................../................../....\........./...\.\/.............................\|.............. .......-...............................-.......|....................|......................../...........|/... ................|...\-....-.......|/......./.......................|../.\-...-....../...\........\......\.|... .....................-.......-....-................|.............-........-....................\....../....-.. \..|.|....-......../......../.../...................|.....................\..--...............-.......||...... .....-.\.....................-...\............../....\.......-/../|...|......../..\..................../...... ....|...\......................|...|.../...|...............\...........-........................|.......--.-.. ......\....|.-...........\................................|.................\..............\..|............... ...................||..................\|...................|....\............-....../........\.../.....-...-. ....................................|....|......./.\..................../..............|../.............\..... ......|...\./......../......|....\..././.......|...............................-.........../.-..\............. .|.../....|.................-..............|..................\....../..........-..........|...|......|./..... .........|.........../..\...|....../...................................................-...................... ../....|/.............|.........../....................\.......\............./.........../.......-.........\-. ................\....................\.....-..|............-......-|...............\......\...-............... ..........|..........|...........|.../.............................-......\.....|\.........\.\.............../ .........................../...........\.............|................../.-.......-....././\.........-........ \....\................../..../.............-../......|.\.........-./..\........./............................. .\..../..............|........../.......\........|.-.-........//\.......|.....-.../..-.....-...........-...... .......|................\.....................\.............-........./..................-...-...........\.... ....../.......-......././.-.....|..........|.........|..........\............................/................ ................\......\................\\.\..\........\.................................\......-/.....-...... ..-...../......-.......................................|.................|......-.-...-.....\....../...-...... ........................\....|.....\....|............................\..............\.......................\. ............................/|...|........\.\....\......-|......................|.....|.\-...-......-......... \..|...........................\.................\.-................../................./..../.\.............. |.../.............\...............................|..|..-......-.......-.......|..\../.........-...........|.. ...........|................\............................../.......................|..../-|................... ...\.|.\..................|.\-/....../-/..|/............\......../\.\...........\\.......-....-\.............. .................................-......./..-............|..\../..................................|/./|..../.. .../..../........|-.........|.....|..............-.................../.....|-.......|.....|...............\... -..-...................//............................./.........-...............-.........|.../...........\... .............././\......|..............\..................|...............-............................-...... /.........|/.....-../|......-.........|..-.-...........-........|..........-.................................. .............\.......|/........../.....|.......-....-....../......-...................-....|........\......... \...|.|.../..|....../....-.........................-..............|.....\.......-........\........-....|...... -.-..\..........|........................./..........|..-./...........................|...........-........-.. ....\./..............-.........|......./.-..............-.-../\........|..|.........-..............\...\.../.. ..|...........\...../......../.../.........\....../....-..................................|/............-...|. .../.........|..-................|..........|....\/..........|..|\.......|...........|........................ ........../.............\...\.............................-...................|................-...-.......... .....................-.................................../../.............................-../................ .-........./......|........-...../...................\..|-........-...\..........././||....................... .........|../../.....-...........-....-..-...|.............................\.................................. ...................-.....\......../............./...............-.......\.........../........|............../. .|\.............................................-.........-....|.....\..................-..-.......\.......... /................/....\.........\|...............-.............|......./...........-.....\........-.......--.. ..........-........\........\-...\....\\........../...|./.........................\.....|.................\../ ............................-.|............................\...\../..........................\......./...../.. .....//.......|..\.........-..\.........-....\..-..\.....-.....//.../......................................... ................................|....|..\............/|./.\....|.............-..\|................./.......... .....|.......-.............-../...../.........|../.....................|........................./.....|...... .-...\...../................\.-........|..|...|...|.........\|......|...../...../..........\................|. .../../............-.........|................\.....\....-...................../.../...........-...|...../|... ..-..........-.......-.............\..............-..............\.......|.................................... ..|................/........................-...................../.................................|......../ ...../........\......./....../......||.......|-...............-.....-............../../....................... ...\..../...................-........\.........\............................/....|.........-..........-....... .../................\....\..|-...........................\.-..-......|.|.-/.....-............./............... ../............\...........................-../....|....................-..............|........./......|...\\ .........................\..................|..\........................./....................\............... /.............|.....................-.....\.....-..|............/..........|./...|....-...-....|-....../...... .\.-.....\............././.........................\..........-......................|........\............... ........\../............../......\.....\..-............|............\............../..|....................... ....-../....\..................................-......../...|................................................- .......................\............-...................../.........\............-../.........\/..|../....-/|. ..../.............|....../............-.|......../.....................|...../..|.....-.............../....... ....................|\...........-...................................../.......................-...-..|..\.|/. ......................-....-\........../..............\.......-....\.....|...............\.........-.......... .|......../.....|.........||.................../.....\...|.........\........../........\............../....... .-............/-..........-...........\..........\.......-.................................................... .....|/....-.../......-......................../.|./...\.......\/......./......../..\...../...|...|.........\- .............../..\.../-......|\\......../............../............|/......................./.......\....... .....\.-./....../............/..-................../....\..................-.................|.......-/..-.... .-................-..-...........................-..|............-.................../...........-...........| -......\......|......\............../.............../...-/.../....\.........................-.....|.....-..... .......\.....--.-............................\..........-./........||......|..\...../..../................|... .............-.....|..../.......|............|....................-......\.............../|...............|... ............|........../........|....................-....|....../.........\..........-........-..-........... ..............|.................-....|...........\.|.../.........../..........-......\|.............\..-...... ......-............\.......\....................................................|\..\.......................-. ................||...........\...-\/..|..............\.........................../.......\.|.............|...| ....-...................-...../....|............\.../.........-..../....\........../..../.|..........\........ ........-.....\........../....|.........\......./...........\.......-..|............../...........-..|........ .................../.....-...........|....-...\......\...|...|...........................\.......||......\|... ......-.........|.....\....-..........|.......\....\..................................../........|...|./...... ..................\.........../.............../.................../.........-.......-..../............/\.../.. ........\...\...\....../.......\\........../............../.-.................../........|..............-..... ....../........................|................-.-......-....|......\\.-...-.|..........|..../............... /.......-.....|.....\...................|...../..............|......|.../....................\.....|.......... |.\....-...............|/....|........../....................................\.-............................/. .......................-...............-.|...................|......\.....-\..|.......-......./\.....-......-. ................................|../.................................-........-...................|........... .....-.........\..-................./...........|...............|....................\/../../........|.-...... ............................../......./.\/........./..|..............|.......................\................ ......./.-.......\...........-...............|............|.............|..........|.|..........|.........--.. ............-..............-.............\./...|.....|................|..........|/.............\............. .../....................-........-.................../.....\.............-...................\................