8000 Day21 part1 · opqdonut/adventofcode24@78ba966 · GitHub
[go: up one dir, main page]

Skip to content

Commit 78ba966

Browse files
committed
Day21 part1
1 parent 7e12df8 commit 78ba966

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

Day21.hs

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
module Day21 where
2+
3+
import Data.List
4+
import Data.Maybe
5+
import Data.Ord
6+
7+
input = ["083A", "935A", "964A", "149A", "789A"]
8+
example = ["029A", "980A", "179A", "456A", "379A"]
9+
10+
type Pad = [(Char,(Int,Int))]
11+
12+
pad :: [String] -> Pad
13+
pad ls = [(c,(x,y)) | (y,l) <- zip [0..] ls
14+
, (x,c) <- zip [0..] l]
15+
16+
numpad = pad ["789"
17+
,"456"
18+
,"123"
19+
," 0A"]
20+
21+
arrowpad = pad [" ^A"
22+
,"<v>"]
23+
24+
paths :: Pad -> Char -> Char -> [[Char]]
25+
paths p from to
26+
| fromX == badX && toY == badY = [hori ++ vert ++ "A"]
27+
| fromY == badY && toX == badX = [vert ++ hori ++ "A"]
28+
| otherwise = nub [hori ++ vert ++ "A", vert ++ hori ++ "A"]
29+
where Just (badX,badY) = lookup ' ' p
30+
Just (fromX,fromY) = lookup from p
31+
Just (toX,toY) = lookup to p
32+
dX = toX-fromX
33+
dY = toY-fromY
34+
vert = replicate (abs dY) (if dY < 0 then '^' else 'v')
35+
hori = replicate (abs dX) (if dX<0 then '<' else '>')
36+
37+
pathsFor :: Pad -> [Char] -> [[Char]]
38+
pathsFor p s = map concat $ sequence [paths p a b | (a:b:_) <- tails ('A':s)]
39+
40+
unlookup v kvs = lookup v (map (\(a,b)->(b,a)) kvs)
41+
42+
unbuttonsFor p ks = go (fromJust $ lookup 'A' p) ks
43+
where go (x,y) ('<':ks) = go (x-1,y) ks
44+
go (x,y) ('>':ks) = go (x+1,y) ks
45+
go (x,y) ('v':ks) = go (x,y+1) ks
46+
go (x,y) ('^':ks) = go (x,y-1) ks
47+
go (x,y) ('A':ks) = fromJust (unlookup (x,y) p) : go (x,y) ks
48+
go _ [] = []
49+
< 5510 code>50+
pathsFull code = concatMap (pathsFor arrowpad) . concatMap (pathsFor arrowpad) $ pathsFor numpad code
51+
52+
bestPath = minimumBy (comparing length) . pathsFull
53+
54+
part1 inp = sum [length (bestPath code) * read (init code) | code <- inp]

0 commit comments

Comments
 (0)
0