day 5
Signed-off-by: Jack Bond-Preston <jackbondpreston@outlook.com>
This commit is contained in:
parent
4c287b2916
commit
08fe41ccd5
74
5/5.hs
Normal file
74
5/5.hs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import System.IO
|
||||||
|
( hClose, openFile, hGetContents, IOMode(ReadMode) )
|
||||||
|
import Text.Parsec
|
||||||
|
import Text.Parsec.String
|
||||||
|
import Control.Monad
|
||||||
|
import Data.List
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.Sequence (replicate, Seq, mapWithIndex)
|
||||||
|
|
||||||
|
import Data.Map (Map, (!))
|
||||||
|
import qualified Data.Map as Map
|
||||||
|
|
||||||
|
type Coord = (Int, Int)
|
||||||
|
type LineEnds = (Coord, Coord)
|
||||||
|
|
||||||
|
type Grid = Map Coord Integer
|
||||||
|
|
||||||
|
int :: Parser Int
|
||||||
|
int = read <$> many1 digit
|
||||||
|
|
||||||
|
eol :: Parser ()
|
||||||
|
eol = void $ char '\n'
|
||||||
|
|
||||||
|
coord :: Parser Coord
|
||||||
|
coord = do
|
||||||
|
x <- int
|
||||||
|
char ','
|
||||||
|
y <- int
|
||||||
|
|
||||||
|
return (x, y)
|
||||||
|
|
||||||
|
arrow :: Parser ()
|
||||||
|
arrow = void $ string " -> "
|
||||||
|
|
||||||
|
line :: Parser LineEnds
|
||||||
|
line = do
|
||||||
|
from <- coord
|
||||||
|
arrow
|
||||||
|
to <- coord
|
||||||
|
|
||||||
|
return (from, to)
|
||||||
|
|
||||||
|
inputParser :: Parser [LineEnds]
|
||||||
|
inputParser = line `endBy1` eol
|
||||||
|
|
||||||
|
lineToCellList :: LineEnds -> [Coord]
|
||||||
|
lineToCellList ((x0, y0), (x1, y1))
|
||||||
|
| x0 == x1 = [ (x0, y) | y <- [min y0 y1 .. max y0 y1] ]
|
||||||
|
| y0 == y1 = [ (x, y0) | x <- [min x0 x1 .. max x0 x1] ]
|
||||||
|
| otherwise = [ (x, y) | x <- [min x0 x1 .. max x0 x1],
|
||||||
|
y <- [min y0 y1 .. max y0 y1],
|
||||||
|
abs (x - x0) == abs (y - y0) ]
|
||||||
|
|
||||||
|
type CoordMap = Map Coord Int
|
||||||
|
|
||||||
|
scoreFold :: Coord -> (CoordMap, Int) -> (CoordMap, Int)
|
||||||
|
scoreFold coord (map, acc)
|
||||||
|
| Map.member coord map = if
|
||||||
|
(map ! coord) == 1 then (Map.adjust (+1) coord map, acc + 1)
|
||||||
|
else (Map.adjust (+1) coord map, acc)
|
||||||
|
| otherwise = (Map.insert coord 1 map, acc)
|
||||||
|
|
||||||
|
score :: [LineEnds] -> Int
|
||||||
|
score les = snd (foldr scoreFold (Map.empty, 0) coords)
|
||||||
|
where
|
||||||
|
coords = concatMap lineToCellList les
|
||||||
|
|
||||||
|
main = do
|
||||||
|
handle <- openFile "input.txt" ReadMode
|
||||||
|
contents <- hGetContents handle
|
||||||
|
case parse inputParser "" contents of
|
||||||
|
Left x -> print x
|
||||||
|
Right x -> print (score x)
|
||||||
|
hClose handle
|
Loading…
Reference in New Issue
Block a user