@@ -25,10 +25,8 @@ module Main (main) where
25
25
import Advent (getInputLines )
26
26
import Advent.Coord (Coord (.. ), coordLines )
27
27
import Advent.Memo (memo2 )
28
- import Data.Map (Map )
28
+ import Data.Map (Map , (!) )
29
29
import Data.Map qualified as Map
30
- import Data.Set (Set )
31
- import Data.Set qualified as Set
32
30
33
31
-- | >>> :main
34
32
-- 177814
@@ -40,21 +38,11 @@ main =
40
38
print (sum (map (score 2 ) codes))
41
39
print (sum (map (score 25 ) codes))
42
40
43
- data Pad = Pad ( Set Coord ) ( Map Char Coord )
41
+ type Pad = Map Char Coord
44
42
45
43
-- | Turn a list of lines into a 'Pad'. Spaces are removed.
46
44
padFromList :: [String ] -> Pad
47
- padFromList strs = Pad (Set. fromList (Map. elems buttons)) buttons
48
- where
49
- buttons = Map. fromList [(c, p) | (p, c) <- coordLines strs, c /= ' ' ]
50
-
51
- -- | Find the coordinate of a button.
52
- padCoord :: Pad -> Char -> Coord
53
- padCoord (Pad _ m) c = m Map. ! c
54
-
55
- -- | Test if a coordinate is contained within the pad.
56
- inPad :: Pad -> Coord -> Bool
57
- inPad (Pad s _) x = Set. member x s
45
+ padFromList strs = Map. fromList [(c, p) | (p, c) <- coordLines strs]
58
46
59
47
-- | The 4-direction pad used to control a robot
60
48
robotPad :: Pad
@@ -73,7 +61,6 @@ shortDoorCode ::
73
61
shortDoorCode n =
74
62
sum . map (minimum . map (shortRobotCode n)) . route doorPad
75
63
76
-
77
64
-- | The length of the shortest input sequence that enters the given
78
65
-- robot directional code via a given number of robot layers.
79
66
shortRobotCode ::
@@ -93,9 +80,9 @@ shortRobotCode = memo2 \case
93
80
-- >>> route doorPad "029A"
94
81
-- [["<A"],["^A"],["^^>A",">^^A"],["vvvA"]]
95
82
route :: Pad -> String -> [[String ]]
96
- route pad str = zipWith (walk pad) (padCoord pad ' A' : absolutes) absolutes
83
+ route pad str = zipWith (walk pad) (pad ! ' A' : absolutes) absolutes
97
84
where
98
- absolutes = map (padCoord pad) str
85
+ absolutes = map (pad ! ) str
99
86
100
87
-- | Find the unique, shortest paths to move from one location to
101
88
-- another on a pad.
@@ -107,6 +94,6 @@ walk pad (C y1 x1) (C y2 x2) =
107
94
replicate (y2 - y1) ' v' ++
108
95
replicate (x2 - x1) ' >' ++
109
96
replicate (x1 - x2) ' <'
110
- , keys <- [ rawKeys | inPad pad ( C y2 x1) ]
111
- ++ [reverse rawKeys | y1 /= y2, x1 /= x2, inPad pad ( C y1 x2) ]
97
+ , keys <- [ rawKeys | pad ! ' ' /= C y2 x1]
98
+ ++ [reverse rawKeys | y1 /= y2, x1 /= x2, pad ! ' ' /= C y1 x2]
112
99
]
0 commit comments