From bf84c6c1bbdade786db74be53fde5519ef789e70 Mon Sep 17 00:00:00 2001 From: Gattix Date: Thu, 5 Jan 2023 13:58:32 +0100 Subject: [PATCH] day15 part1 --- 2022/day15/day15.hs | 90 ++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/2022/day15/day15.hs b/2022/day15/day15.hs index 5aa2e0e..58067ef 100644 --- a/2022/day15/day15.hs +++ b/2022/day15/day15.hs @@ -1,62 +1,60 @@ -import Data.List.Split -import qualified Data.Map as M import Control.Lens import Data.List +import Data.List.Split +import qualified Data.Map as M import Linear.V2 type Sensor = (V2 Int, V2 Int) + type Cave = M.Map (V2 Int) Char main :: IO () main = do input <- map (splitOneOf "=,:") . lines <$> readFile "input" - let p = map parse input - let c = M.fromList $ fillCave p - putStrLn $ intercalate "\n" $ print2D 50 $ map fst $ M.toList c - let f = fillCave2 p - print $ M.filterWithKey (\(V2 _ a) b -> a == 10) f - print $ length $ M.filterWithKey (\(V2 _ a) b -> a == 10 && b == '#') $ M.union f c + let sensors = map parse input +-- print $ "Cave from to: " ++ show (caveMinMaxX sensors) +-- print $ part1 (caveMinMaxX sensors) sensors +-- print $ getBorder sensors +-- print $ last [(x,x) | x<-[0..10000]] +-- print $ last [(x,y) | x<-[0..10000], y<-[0..10000], x==y] + print "hello world" + + +allCandidates :: [Sensor] -> [Int] -> [V2 Int] +allCandidates (s:ss) ds = undefined + +getBorder :: [Sensor] -> [V2 Int] +getBorder (s:ss) = map (+ (fst s)) xs ++ getBorder ss + where xs = [V2 x (d - x) | x<-[-d..0]++[1..d]] + d = succ $ dist s + +caveMinMaxX :: [Sensor] -> (Int, Int) +caveMinMaxX sensors = (minimum k, maximum l) + where + d = map dist sensors + s = map (view _y . fst) sensors + k = zipWith (-) s d + l = zipWith (+) s d + +part1 :: (Int, Int) -> [Sensor] -> Int +part1 (a, b) sensors = length $ filter (== '#') $ map (checkPoint sensors) xs + where + xs = [V2 x 2000000 | x <- [a .. b]] --y=10 for testinput parse :: [String] -> Sensor parse [_, a, _, b, _, c, _, d] = (V2 (read a) (read b), V2 (read c) (read d)) +checkPoint :: [Sensor] -> V2 Int -> Char +checkPoint sensors point + | point `elem` map fst sensors = 'S' + | point `elem` map snd sensors = 'B' + | otherwise = checkPoint' sensors point + where + checkPoint' (s:ss) p = + if dist (fst s, p) <= dist s + then '#' + else checkPoint' ss p + checkPoint' [] _ = ' ' + dist :: Sensor -> Int dist (a, b) = sum $ abs $ a - b - -fillCave :: [Sensor] -> [(V2 Int, Char)] -fillCave (x:xs) = sensor ++ fillCave xs - where d = dist x - pRel = [V2 x y | x<-[(-d)..(d)],y<-[(-d)..(d)], abs x + abs y <= d] - sensor = zip (map (+fst x) pRel) (repeat '#') -fillCave [] = [] - -fillCave2 :: [Sensor] -> Cave -fillCave2 (x:xs) = newC `M.union` fillCave2 xs - where newC = M.insert (snd x) 'B' $ M.insert (fst x) 'S' (M.empty) -fillCave2 [] = M.empty - - - - - - - - - - - -p :: Int -> [Int] -> String -p n (x:xs) = - if n == x - then '#' : p (n + 1) xs - else '.' : p (n + 1) (x : xs) -p _ [] = [] - -print2D :: Int -> [V2 Int] -> [String] -print2D n coords - | n == pred minY = [] - | otherwise = p minX line : print2D (n - 1) coords - where - line = nub $ sort $ map (^. _x) (filter (\(V2 _ a) -> a == n) coords) - minY = minimum $ map (^. _y) coords - minX = minimum $ map (^. _x) coords