Day 11
This commit is contained in:
@@ -84,3 +84,11 @@ executable day10
|
||||
build-depends: base ^>=4.15.1.0, array
|
||||
hs-source-dirs: day10
|
||||
default-language: Haskell2010
|
||||
|
||||
executable day11
|
||||
main-is: Main.hs
|
||||
other-modules: Commons Part1 Part2
|
||||
|
||||
build-depends: base ^>=4.15.1.0, array, Unique
|
||||
hs-source-dirs: day11
|
||||
default-language: Haskell2010
|
||||
|
||||
46
day11/Commons.hs
Normal file
46
day11/Commons.hs
Normal file
@@ -0,0 +1,46 @@
|
||||
module Commons where
|
||||
|
||||
import GHC.IO.Handle (isEOF)
|
||||
import Data.Array (Array, listArray, (!), indices)
|
||||
import Data.List.Unique (sortUniq)
|
||||
|
||||
|
||||
type Image = [(Int, Int)]
|
||||
type ExpansionArray = Array Int Int
|
||||
|
||||
|
||||
parseLine :: Int -> Int -> String -> Image
|
||||
parseLine _ _ [] = []
|
||||
parseLine row column ('#': t) = (column, row): parseLine row (column + 1) t
|
||||
parseLine row column (_: t) = parseLine row (column + 1) t
|
||||
|
||||
parseImage :: Int -> Image -> IO Image
|
||||
parseImage row image = do done <- isEOF
|
||||
if done
|
||||
then return image
|
||||
else do line <- getLine
|
||||
parseImage (row + 1) (image ++ parseLine row 1 line)
|
||||
|
||||
parse :: IO Image
|
||||
parse = parseImage 1 []
|
||||
|
||||
|
||||
getExpansionArray :: Int -> Int -> Int -> [Int] -> [Int]
|
||||
getExpansionArray _ _ _ [] = []
|
||||
getExpansionArray i expOffset expInc (h: t)
|
||||
| i == h = i + expOffset: getExpansionArray (i + 1) expOffset expInc t
|
||||
| i < h = i + expOffset: getExpansionArray (i + 1) (expOffset + expInc) expInc (h: t)
|
||||
|
||||
getExpansionArrays :: Int -> Image -> (ExpansionArray, ExpansionArray)
|
||||
getExpansionArrays expInc image = let expX = getExpansionArray 1 0 expInc $ sortUniq . map fst $ image
|
||||
expY = getExpansionArray 1 0 expInc $ sortUniq . map snd $ image
|
||||
in (listArray (1, length expX) expX, listArray (1, length expY) expY)
|
||||
|
||||
getDistancesGalaxy :: Image -> (ExpansionArray, ExpansionArray) -> (Int, Int) -> [Int]
|
||||
getDistancesGalaxy [] _ _ = []
|
||||
getDistancesGalaxy ((x0, y0): t) (expX, expY) (x1, y1) =
|
||||
abs ((expX ! x0) - (expX ! x1)) + abs ((expY ! y0) - (expY ! y1)): getDistancesGalaxy t (expX, expY) (x1, y1)
|
||||
|
||||
getDistances :: Image -> (ExpansionArray, ExpansionArray) -> [[Int]]
|
||||
getDistances [] _ = []
|
||||
getDistances (h: t) (expX, expY) = getDistancesGalaxy t (expX, expY) h: getDistances t (expX, expY)
|
||||
12
day11/Main.hs
Normal file
12
day11/Main.hs
Normal file
@@ -0,0 +1,12 @@
|
||||
module Main where
|
||||
|
||||
import Commons
|
||||
import qualified Part1
|
||||
import qualified Part2
|
||||
|
||||
|
||||
main = do image <- parse
|
||||
let part1Res = sum . concat $ Part1.computeDistances image
|
||||
print part1Res
|
||||
let part2Res = sum . concat $ Part2.computeDistances image
|
||||
print part2Res
|
||||
8
day11/Part1.hs
Normal file
8
day11/Part1.hs
Normal file
@@ -0,0 +1,8 @@
|
||||
module Part1 where
|
||||
|
||||
import Commons
|
||||
|
||||
|
||||
computeDistances :: Image -> [[Int]]
|
||||
computeDistances image = let expansionArrays = getExpansionArrays 1 image
|
||||
in getDistances image expansionArrays
|
||||
8
day11/Part2.hs
Normal file
8
day11/Part2.hs
Normal file
@@ -0,0 +1,8 @@
|
||||
module Part2 where
|
||||
|
||||
import Commons
|
||||
|
||||
|
||||
computeDistances :: Image -> [[Int]]
|
||||
computeDistances image = let expansionArrays = getExpansionArrays 999999 image
|
||||
in getDistances image expansionArrays
|
||||
Reference in New Issue
Block a user