Initial commit
This commit is contained in:
commit
f242d2b0df
420 changed files with 62521 additions and 0 deletions
56
2017/11/day11.hs
Normal file
56
2017/11/day11.hs
Normal file
|
@ -0,0 +1,56 @@
|
|||
#!/usr/bin/env stack
|
||||
-- stack --resolver lts-9.17 script
|
||||
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
import Data.Attoparsec.Text
|
||||
import Data.Text (Text)
|
||||
import qualified Data.Text as T
|
||||
import Control.Applicative
|
||||
import Data.List
|
||||
|
||||
data Direction = N | NE | NW | S | SE | SW
|
||||
deriving (Eq, Show)
|
||||
|
||||
type Path = [Direction]
|
||||
|
||||
type Coord = (Int, Int, Int)
|
||||
|
||||
parseDirection :: Parser Direction
|
||||
parseDirection =
|
||||
(string "ne" >> return NE)
|
||||
<|> (string "nw" >> return NW)
|
||||
<|> (string "se" >> return SE)
|
||||
<|> (string "sw" >> return SW)
|
||||
<|> (string "n" >> return N)
|
||||
<|> (string "s" >> return S)
|
||||
|
||||
parsePath :: Parser Path
|
||||
parsePath = do
|
||||
path <- many' (option "" (string ",") *> parseDirection)
|
||||
return path
|
||||
|
||||
step :: Coord -> Direction -> Coord
|
||||
step (x,y,z) dir = case dir of
|
||||
N -> (x, y+1, z-1)
|
||||
NE -> (x+1, y, z-1)
|
||||
NW -> (x-1, y+1, z)
|
||||
S -> (x, y-1, z+1)
|
||||
SE -> (x+1, y-1, z)
|
||||
SW -> (x-1, y, z+1)
|
||||
|
||||
finalCoord :: Path -> Coord
|
||||
finalCoord = foldl' step (0,0,0)
|
||||
|
||||
allSteps :: Path -> [Coord]
|
||||
allSteps = scanl' step (0,0,0)
|
||||
|
||||
distance :: Coord -> Int
|
||||
distance (x,y,z) = maximum $ map abs [x,y,z]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
Right path <- parseOnly parsePath . T.pack <$> getLine
|
||||
--putStrLn . show $ path
|
||||
putStrLn . show . distance .finalCoord $ path
|
||||
putStrLn . show . maximum . map distance . allSteps $ path
|
Loading…
Add table
Add a link
Reference in a new issue