[hs] Solve 2020_17 part 1

This commit is contained in:
Joscha 2020-12-18 17:02:03 +00:00
parent c29e148001
commit ecf8c1f7b7
2 changed files with 59 additions and 0 deletions

View file

@ -19,6 +19,7 @@ import qualified Aoc.Y2020.D13 as D13
import qualified Aoc.Y2020.D14 as D14 import qualified Aoc.Y2020.D14 as D14
import qualified Aoc.Y2020.D15 as D15 import qualified Aoc.Y2020.D15 as D15
import qualified Aoc.Y2020.D16 as D16 import qualified Aoc.Y2020.D16 as D16
import qualified Aoc.Y2020.D17 as D17
import qualified Aoc.Y2020.D18 as D18 import qualified Aoc.Y2020.D18 as D18
year :: Year year :: Year
@ -39,5 +40,6 @@ year = Year 2020
, (14, D14.day) , (14, D14.day)
, (15, D15.day) , (15, D15.day)
, (16, D16.day) , (16, D16.day)
, (17, D17.day)
, (18, D18.day) , (18, D18.day)
] ]

57
hs/src/Aoc/Y2020/D17.hs Normal file
View file

@ -0,0 +1,57 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
module Aoc.Y2020.D17
( day
) where
import qualified Data.Set as Set
import Aoc.Day
import Aoc.Parse
parser :: Parser [[Bool]]
parser = manyLines $ many $ (False <$ char '.') <|> (True <$ char '#')
type Pos = (Int, Int, Int)
type World = Set.Set Pos
newWorld :: [[Bool]] -> World
newWorld
= Set.fromList
. map fst
. filter snd
. concat
. zipWith (\y -> zipWith (\x -> ((x, y, 0),)) [0..]) [0..]
vicinity :: Pos -> [Pos]
vicinity (x, y, z) = (,,) <$> [x - 1, x, x + 1] <*> [y - 1, y, y + 1] <*> [z - 1, z, z + 1]
neighbours :: Pos -> [Pos]
neighbours p = [p2 | p2 <- vicinity p, p2 /= p]
interesting :: World -> Set.Set Pos
interesting w = Set.fromList $ vicinity =<< Set.toList w
alive :: Bool -> Int -> Bool
alive True 2 = True
alive True 3 = True
alive False 3 = True
alive _ _ = False
step :: World -> World
step w = Set.filter go $ interesting w
where
go p = alive (p `Set.member` w) (length $ filter (`Set.member` w) $ neighbours p)
steps :: World -> World
steps = foldr (.) id $ replicate 6 step
solver :: [[Bool]] -> IO ()
solver slice = do
putStrLn ">> Part 1"
let world = newWorld slice
print $ Set.size $ steps world
day :: Day
day = dayParse parser solver