|
| 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