Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import System.IO
- type SpaceImage = String
- type Size = (Int, Int)
- totalSize size = fst size * snd size
- count :: Eq a => a -> [a] -> Int
- count x = length . filter (x==)
- data Layer = Layer { getData :: [Int] } deriving (Show)
- instance Eq Layer where
- (Layer a) == (Layer b) = count 0 a == count 0 b
- instance Ord Layer where
- compare (Layer a) (Layer b) = count 0 a `compare` count 0 b
- identifyLayer :: Layer -> Int
- identifyLayer (Layer l) = count 1 l * count 2 l
- layerFits :: Size -> SpaceImage -> Bool
- layerFits size img = length img `div` totalSize size > 0
- parseLayer :: Size -> SpaceImage -> Layer
- parseLayer size img = Layer $ map (read . pure :: Char -> Int) $ take (totalSize size) img
- parseLayers :: Size -> SpaceImage -> [Layer]
- parseLayers size img
- | layerFits size img = do let layer = parseLayer size img
- [layer] ++ parseLayers size (drop (length $ getData layer) img)
- | otherwise = []
- main = do
- contents <- readFile "input8"
- print $ identifyLayer $ minimum $ parseLayers (25, 6) contents
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement