day15 part1
This commit is contained in:
parent
44730f650f
commit
bf84c6c1bb
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user