45 lines
1,010 B
Haskell
45 lines
1,010 B
Haskell
|
#!/usr/bin/env runghc
|
||
|
|
||
|
import Data.Array
|
||
|
|
||
|
data Cell = Open | Tree
|
||
|
deriving (Eq)
|
||
|
|
||
|
charToCell '.' = Open
|
||
|
charToCell '#' = Tree
|
||
|
|
||
|
isValidCell '.' = True
|
||
|
isValidCell '#' = True
|
||
|
isValidCell _ = False
|
||
|
|
||
|
instance Read Cell where
|
||
|
readsPrec _ (c:rest) = [(charToCell c, rest)]
|
||
|
readList input =
|
||
|
let (valid, rest) = span isValidCell input
|
||
|
in [(map charToCell valid, rest)]
|
||
|
|
||
|
cellToChar Open = '.'
|
||
|
cellToChar Tree = '#'
|
||
|
|
||
|
instance Show Cell where
|
||
|
show cell = [cellToChar cell]
|
||
|
showList = (++) . map cellToChar
|
||
|
|
||
|
main = interact (show . solve . map (read :: String -> [Cell]) . lines)
|
||
|
|
||
|
solve rows = count (==Tree) $ map at path
|
||
|
where
|
||
|
board = toArray $ map toArray rows
|
||
|
(_, y) = fmap (+1) $ bounds board
|
||
|
(_, x) = fmap (+1) $ bounds $ board ! 0
|
||
|
xIdx i = mod i x
|
||
|
yIdx i = mod i y
|
||
|
deltaY = 1
|
||
|
deltaX = 3
|
||
|
at (x', y') = (board ! (yIdx y')) ! (xIdx x')
|
||
|
path = [(i*3, i) | i <- [0..y]]
|
||
|
|
||
|
count predicate xs = length $ filter predicate xs
|
||
|
|
||
|
toArray l = listArray (0, length l - 1) l
|