Today’s challenge can be solved by simple implementation. This post is literate Haskell.
import Data.List.Split
main :: IO ()
= do main
The input is a subset of the local geology. The full geology is obtained by repeating the pattern as many times as necessary along the horizontal dimension.
So no need for intricate parsing, I’ll store it just about as is.
<- lines <$> readFile "day03.in" geology
Now to count trees along a provided slope.
let slope right down =
I’ll generate the list of positions encountered, and count those that are a tree.
length $ filter (== '#') $
To generate the positions, I’ll use a helper function that extracts a position from a pattern line and an X coordinate.
zipWith (\row i -> row !! (i `mod` length row))
The pattern lines are already what’s stored in the
geology
variable, so I’d use it directly. Except for
part 2, where one of the slopes skips a line out of two. So I use
chunksOf
to generalize the skipping aspect.
map head (chunksOf down geology)) (
The X coordinates are a simple arithmetic sequence, generated by built-in syntax for enumerations.
0,right..] [
The rest if wrapping: a single count for part 1, the product of multiple counts for part 2.
print $ slope 3 1
print $ product $ [ slope 1 1, slope 3 1, slope 5 1, slope 7 1, slope 1 2 ]
This concludes today’s solution. See you soon!