do not use intermediate sets

This commit is contained in:
Quinten Kock 2021-12-20 13:34:50 +01:00
parent 7e38572684
commit fbf5324a9d
1 changed files with 14 additions and 27 deletions

View File

@ -6,14 +6,14 @@ import Debug.Trace (traceShow, trace)
import Data.Maybe (catMaybes)
type Algorithm = A.Array Int Bool
data Image = Img Bool (S.Set (Int,Int)) deriving (Show)
data Image = Img Bool [(Int,Int)] deriving (Show)
getNd :: Image -> S.Set (Int,Int)
getNd :: Image -> [(Int,Int)]
getNd (Img _ s) = s
getLit :: Image -> Int
getLit (Img True s) = error "all elems lit"
getLit (Img False s) = length $ S.elems s
getLit (Img False s) = length s
newDefault :: Algorithm -> Bool -> Bool
newDefault algo False = algo A.! 0
@ -32,17 +32,17 @@ next algo (Img def diff) = Img (newDefault algo def) newDiff where
neighs x y = map (\i -> ((x-1 + i `mod` 3, y-1 + i `div` 3), [i])) [0..8]
calcNonDef = M.filter (/= newDefault algo def) $ M.map (\ns -> algo A.! binToDec (nonDefToNum ns)) nonDefault
nonDefToNum ns = map (\i -> if i `elem` ns then not def else def) [0..8]
newDiff = S.fromList $ M.keys calcNonDef
newDiff = M.keys calcNonDef
printImage :: Image -> IO ()
printImage img = do
mapM_ (\y -> do
mapM_ (\x -> if (x,y) `S.member` getNd img then putChar '#' else putChar '.') [minx..maxx];
mapM_ (\x -> if (x,y) `elem` getNd img then putChar '#' else putChar '.') [minx..maxx];
putStrLn "") [miny..maxy] where
minx = minimum $ map fst $ S.elems $ getNd img
maxx = maximum $ map fst $ S.elems $ getNd img
miny = minimum $ map snd $ S.elems $ getNd img
maxy = maximum $ map snd $ S.elems $ getNd img
minx = minimum $ map fst $ getNd img
maxx = maximum $ map fst $ getNd img
miny = minimum $ map snd $ getNd img
maxy = maximum $ map snd $ getNd img
main :: IO()
@ -51,29 +51,16 @@ main = do
getLine
content <- lines <$> getContents
let nonDef = catMaybes $ concat $ zipWith (\j -> zipWith (\i e -> if e =='#' then Just (i,j) else Nothing) [0..]) [0..] content
let init = Img False $ S.fromList nonDef
let init = Img False nonDef
mapM_ print content
putStr "initial: "
print init
printImage init
putStr "after 1: "
let first = next algorithm init
print first
printImage first
putStr "after 2: "
let second = next algorithm first
print second
printImage second
let enhanced = iterate (next algorithm) init
putStr "part 1: "
print $ getLit second
print $ getLit $ enhanced !! 2
let enhanced = iterate (next algorithm) init !! 50
-- let enhanced = iterate (next algorithm) init !! 50
putStr "part 2: "
print $ getLit enhanced
print $ getLit $ enhanced !! 50