Day 06.
This commit is contained in:
parent
ac3bd77f23
commit
4858769427
|
@ -11,9 +11,9 @@ To arrive at [⟨ortho|normal⟩](https://hilb.ert.space) as December comes.
|
|||
| 01 | < 0.1 |
|
||||
| 02 | < 0.1 |
|
||||
| 03 | ~ 2 |
|
||||
| 04 | |
|
||||
| 05 | |
|
||||
| 06 | |
|
||||
| 04 | ~ 1 |
|
||||
| 05 | ~ 1 |
|
||||
| 06 | ~ 3 |
|
||||
| 07 | |
|
||||
| 08 | |
|
||||
| 09 | |
|
||||
|
|
|
@ -30,4 +30,4 @@ import qualified Day24
|
|||
import qualified Day25
|
||||
|
||||
main :: IO ()
|
||||
main = Day05.main
|
||||
main = Day06.main
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
77, 279
|
||||
216, 187
|
||||
72, 301
|
||||
183, 82
|
||||
57, 170
|
||||
46, 335
|
||||
55, 89
|
||||
71, 114
|
||||
313, 358
|
||||
82, 88
|
||||
78, 136
|
||||
339, 314
|
||||
156, 281
|
||||
260, 288
|
||||
125, 249
|
||||
150, 130
|
||||
210, 271
|
||||
190, 258
|
||||
73, 287
|
||||
187, 332
|
||||
283, 353
|
||||
66, 158
|
||||
108, 97
|
||||
237, 278
|
||||
243, 160
|
||||
61, 52
|
||||
353, 107
|
||||
260, 184
|
||||
234, 321
|
||||
181, 270
|
||||
104, 84
|
||||
290, 109
|
||||
193, 342
|
||||
43, 294
|
||||
134, 211
|
||||
50, 129
|
||||
92, 112
|
||||
309, 130
|
||||
291, 170
|
||||
89, 204
|
||||
186, 177
|
||||
286, 302
|
||||
188, 145
|
||||
40, 52
|
||||
254, 292
|
||||
270, 287
|
||||
238, 216
|
||||
299, 184
|
||||
141, 264
|
||||
117, 129
|
40
src/Day06.hs
40
src/Day06.hs
|
@ -1,6 +1,42 @@
|
|||
module Day06 (main) where
|
||||
|
||||
import Data.List (maximumBy, sortBy)
|
||||
import Data.Ord (comparing)
|
||||
import Data.Function (on)
|
||||
import Data.Map (fromListWith, toAscList)
|
||||
import Data.Set (fromList, toList)
|
||||
|
||||
-- given a list of elements, return pairs of the element with its frequency
|
||||
-- if two elements have the same frequency, the elements are sorted in ascending order
|
||||
getElemFreqs :: Ord a => [a] -> [(a, Int)]
|
||||
getElemFreqs = sortBy (flip $ comparing snd) . toAscList . fromListWith (+) . (flip zip) (repeat 1)
|
||||
|
||||
part1 :: [(Int, Int)] -> Int
|
||||
part1 coords =
|
||||
let maxrow = fst $ maximumBy (comparing fst) coords
|
||||
maxcol = snd $ maximumBy (comparing snd) coords
|
||||
grid = map closest [(r, c) | r <- [1..maxrow], c <- [1..maxcol]]
|
||||
edges = toList . fromList . map closest . concat $ [[(r, 1), (1, c), (r, maxcol), (maxrow, c)] | r <- [1..maxrow], c <- [1..maxcol]]
|
||||
in snd . head . filter ((`notElem` edges) . fst) . getElemFreqs $ grid
|
||||
where
|
||||
closest coord =
|
||||
let (car:cadr:_) = sortBy (comparing (manhattan coord)) coords
|
||||
in if ((==) `on` manhattan coord) car cadr
|
||||
then ((-1), (-1))
|
||||
else car
|
||||
manhattan (r1, c1) (r2, c2) = abs (r1 - r2) + abs (c1 - c2)
|
||||
|
||||
part2 :: [(Int, Int)] -> Int
|
||||
part2 coords =
|
||||
let maxrow = fst $ maximumBy (comparing fst) coords
|
||||
maxcol = snd $ maximumBy (comparing snd) coords
|
||||
in length . filter closeBy $ [(r, c) | r <- [1..maxrow], c <- [1..maxcol]]
|
||||
where
|
||||
closeBy coord = (sum $ map (manhattan coord) coords) < 10000
|
||||
manhattan (r1, c1) (r2, c2) = abs (r1 - r2) + abs (c1 - c2)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- readFile "input/06.txt"
|
||||
print input
|
||||
input <- map (read . ('(':) . (++ [')'])) . lines <$> readFile "input/06.txt"
|
||||
print $ part1 input
|
||||
print $ part2 input
|
Loading…
Reference in New Issue