~rootmos/AoC

4a9fb9c2d60b7203839cfa0e3735052728d7aef4 — Gustav Behm 9 days ago bfe24c4
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 @@
\./....\../......................|............../-.......|....................|....../|\..../.............\...
...........|.-.............|.././........../........................./...........||.....................-....\
...............\.............-...................-............/.|...|.......-...............................-.
.......................................\..|-.../\....../.........|............/...|.....-.|...........\...|...
............/.-..|...\........|...........-......................\.........-........\....../....|.........|...
................-...........-|....\.................-........\........\...|.././......./......................
......................-....../.-........../........\....../..../.............-..........|.|.................|.
...|....................|.|../.......\.......|.......-...............|.......\......\....................|\...
.........\.............|.......-.....................|....................|..................-.......\-...\...
.../............-........../.||..../........-...../-.........-......./......\........|........................
....|..../.../../.....\..............-.-................../........|...../....\....\...................|......
.......\..-..................|..../..........|....................-............/...................\|../......
..-.\................../................../....\........./...\.\/.............................\|..............
.......-...............................-.......|....................|......................../...........|/...
................|...\-....-.......|/......./.......................|../.\-...-....../...\........\......\.|...
.....................-.......-....-................|.............-........-....................\....../....-..
\..|.|....-......../......../.../...................|.....................\..--...............-.......||......
.....-.\.....................-...\............../....\.......-/../|...|......../..\..................../......
....|...\......................|...|.../...|...............\...........-........................|.......--.-..
......\....|.-...........\................................|.................\..............\..|...............
...................||..................\|...................|....\............-....../........\.../.....-...-.
....................................|....|......./.\..................../..............|../.............\.....
......|...\./......../......|....\..././.......|...............................-.........../.-..\.............
.|.../....|.................-..............|..................\....../..........-..........|...|......|./.....
.........|.........../..\...|....../...................................................-......................
../....|/.............|.........../....................\.......\............./.........../.......-.........\-.
................\....................\.....-..|............-......-|...............\......\...-...............
..........|..........|...........|.../.............................-......\.....|\.........\.\.............../
.........................../...........\.............|................../.-.......-....././\.........-........
\....\................../..../.............-../......|.\.........-./..\........./.............................
.\..../..............|........../.......\........|.-.-........//\.......|.....-.../..-.....-...........-......
.......|................\.....................\.............-........./..................-...-...........\....
....../.......-......././.-.....|..........|.........|..........\............................/................
................\......\................\\.\..\........\.................................\......-/.....-......
..-...../......-.......................................|.................|......-.-...-.....\....../...-......
........................\....|.....\....|............................\..............\.......................\.
............................/|...|........\.\....\......-|......................|.....|.\-...-......-.........
\..|...........................\.................\.-................../................./..../.\..............
|.../.............\...............................|..|..-......-.......-.......|..\../.........-...........|..
...........|................\............................../.......................|..../-|...................
...\.|.\..................|.\-/....../-/..|/............\......../\.\...........\\.......-....-\..............
.................................-......./..-............|..\../..................................|/./|..../..
.../..../........|-.........|.....|..............-.................../.....|-.......|.....|...............\...
-..-...................//............................./.........-...............-.........|.../...........\...
.............././\......|..............\..................|...............-............................-......
/.........|/.....-../|......-.........|..-.-...........-........|..........-..................................
.............\.......|/........../.....|.......-....-....../......-...................-....|........\.........
\...|.|.../..|....../....-.........................-..............|.....\.......-........\........-....|......
-.-..\..........|........................./..........|..-./...........................|...........-........-..
....\./..............-.........|......./.-..............-.-../\........|..|.........-..............\...\.../..
..|...........\...../......../.../.........\....../....-..................................|/............-...|.
.../.........|..-................|..........|....\/..........|..|\.......|...........|........................
........../.............\...\.............................-...................|................-...-..........
.....................-.................................../../.............................-../................
.-........./......|........-...../...................\..|-........-...\..........././||.......................
.........|../../.....-...........-....-..-...|.............................\..................................
...................-.....\......../............./...............-.......\.........../........|............../.
.|\.............................................-.........-....|.....\..................-..-.......\..........
/................/....\.........\|...............-.............|......./...........-.....\........-.......--..
..........-........\........\-...\....\\........../...|./.........................\.....|.................\../
............................-.|............................\...\../..........................\......./...../..
.....//.......|..\.........-..\.........-....\..-..\.....-.....//.../.........................................
................................|....|..\............/|./.\....|.............-..\|................./..........
.....|.......-.............-../...../.........|../.....................|........................./.....|......
.-...\...../................\.-........|..|...|...|.........\|......|...../...../..........\................|.
.../../............-.........|................\.....\....-...................../.../...........-...|...../|...
..-..........-.......-.............\..............-..............\.......|....................................
..|................/........................-...................../.................................|......../
...../........\......./....../......||.......|-...............-.....-............../../.......................
...\..../...................-........\.........\............................/....|.........-..........-.......
.../................\....\..|-...........................\.-..-......|.|.-/.....-............./...............
../............\...........................-../....|....................-..............|........./......|...\\
.........................\..................|..\........................./....................\...............
/.............|.....................-.....\.....-..|............/..........|./...|....-...-....|-....../......
.\.-.....\............././.........................\..........-......................|........\...............
........\../............../......\.....\..-............|............\............../..|.......................
....-../....\..................................-......../...|................................................-
.......................\............-...................../.........\............-../.........\/..|../....-/|.
..../.............|....../............-.|......../.....................|...../..|.....-.............../.......
....................|\...........-...................................../.......................-...-..|..\.|/.
......................-....-\........../..............\.......-....\.....|...............\.........-..........
.|......../.....|.........||.................../.....\...|.........\........../........\............../.......
.-............/-..........-...........\..........\.......-....................................................
.....|/....-.../......-......................../.|./...\.......\/......./......../..\...../...|...|.........\-
.............../..\.../-......|\\......../............../............|/......................./.......\.......
.....\.-./....../............/..-................../....\..................-.................|.......-/..-....
.-................-..-...........................-..|............-.................../...........-...........|
-......\......|......\............../.............../...-/.../....\.........................-.....|.....-.....
.......\.....--.-............................\..........-./........||......|..\...../..../................|...
.............-.....|..../.......|............|....................-......\.............../|...............|...
............|........../........|....................-....|....../.........\..........-........-..-...........
..............|.................-....|...........\.|.../.........../..........-......\|.............\..-......
......-............\.......\....................................................|\..\.......................-.
................||...........\...-\/..|..............\.........................../.......\.|.............|...|
....-...................-...../....|............\.../.........-..../....\........../..../.|..........\........
........-.....\........../....|.........\......./...........\.......-..|............../...........-..|........
.................../.....-...........|....-...\......\...|...|...........................\.......||......\|...
......-.........|.....\....-..........|.......\....\..................................../........|...|./......
..................\.........../.............../.................../.........-.......-..../............/\.../..
........\...\...\....../.......\\........../............../.-.................../........|..............-.....
....../........................|................-.-......-....|......\\.-...-.|..........|..../...............
/.......-.....|.....\...................|...../..............|......|.../....................\.....|..........
|.\....-...............|/....|........../....................................\.-............................/.
.......................-...............-.|...................|......\.....-\..|.......-......./\.....-......-.
................................|../.................................-........-...................|...........
.....-.........\..-................./...........|...............|....................\/../../........|.-......
............................../......./.\/........./..|..............|.......................\................
......./.-.......\...........-...............|............|.............|..........|.|..........|.........--..
............-..............-.............\./...|.....|................|..........|/.............\.............
.../....................-........-.................../.....\.............-...................\................