From b2542fa25011f265c4bfcdb2a57d408cf3fa80aa Mon Sep 17 00:00:00 2001 From: shu Date: Sat, 14 Dec 2019 15:56:18 +0100 Subject: [PATCH] Day 10: Minor cleanup Still not pretty but at least nothing glaring --- 2019/day10/day10.hs | 50 +++++++++++---------------------------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/2019/day10/day10.hs b/2019/day10/day10.hs index 1f4ea5d..5e986b5 100644 --- a/2019/day10/day10.hs +++ b/2019/day10/day10.hs @@ -1,42 +1,26 @@ -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE BangPatterns #-} -{-# LANGUAGE ParallelListComp #-} - import Data.List as L import Data.Maybe import Data.Ord -import Data.Ratio import qualified Data.Vector as V -type Asteroid_old = (Int, Int) - data Asteroid = Asteroid Int Int deriving (Show) instance Eq Asteroid where - Asteroid a b == Asteroid c d = reduce a b == reduce c d - where - reduce x y - | y == 0 && x == 0 = (0, 0) - | x == 0 = (0, signum y) - | y == 0 = (signum x, 0) - | otherwise = - (signum x * (abs $numerator z), signum y * (abs $denominator z)) - where - z = x %y + Asteroid a b == Asteroid c d = phi' a b == phi' c d instance Ord Asteroid where - Asteroid a b `compare` Asteroid c d = (phi a b) `compare` (phi c d) + Asteroid a b `compare` Asteroid c d = phi a b `compare` phi c d where phi x y = phi' (fromIntegral x) (fromIntegral y) - phi' :: Double -> Double -> Double - phi' x y - | x >= 0 = atan2 x (-y) - | otherwise = 2 * pi + atan2 (-x) y -(+|) :: Asteroid -> Asteroid -> Asteroid -(+|) (Asteroid a b) (Asteroid c d) = Asteroid (a + c) (b + d) +phi' :: Int -> Int -> Double +phi' xi yi + | x >= 0 = atan2 x (-y) + | otherwise = 2 * pi + atan2 (-x) y + where x = fromIntegral xi + y = fromIntegral yi (-|) :: Asteroid -> Asteroid -> Asteroid (-|) (Asteroid a b) (Asteroid c d) = Asteroid (a - c) (b - d) @@ -47,11 +31,11 @@ neg (Asteroid a b) = Asteroid (-a) (-b) dist :: Asteroid -> Int dist (Asteroid x y) = abs x + abs y +main :: IO () main = do content <- lines <$> readFile "input" - print $ parse content - let aMax = fst $ maxInSight $ parse content - print aMax + let (aMax,sMax) = maxInSight $ parse content + print sMax let newlist = listCycle $ sort $ @@ -84,14 +68,4 @@ maxInSight :: [Maybe Asteroid] -> (Asteroid, Int) maxInSight xs = maximumBy (comparing snd) $ map (f . transformCoordinates xs) (catMaybes xs) where - f (x, y) = (x, pred . length . nub $ y) - -asts :: [String] -> [Maybe Asteroid_old] -asts xxs = - L.nub - [ if (xxs !! y) !! (x) == '.' - then Nothing - else Just (x, y) - | y <- [0 .. (L.length $ L.head xxs) - 1] - , x <- [0 .. L.length xxs - 1] - ] + f (x, y) = (x, length . nub $ y)