Day 1
This commit is contained in:
parent
51c47c880c
commit
642a3c5773
5 changed files with 1053 additions and 0 deletions
6
inputs/day1-example.input
Normal file
6
inputs/day1-example.input
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3
|
1
inputs/day1-example.solution
Normal file
1
inputs/day1-example.solution
Normal file
|
@ -0,0 +1 @@
|
||||||
|
11
|
1000
inputs/day1.input
Normal file
1000
inputs/day1.input
Normal file
File diff suppressed because it is too large
Load diff
|
@ -12,6 +12,8 @@ dependencies:
|
||||||
- matrix
|
- matrix
|
||||||
- vector
|
- vector
|
||||||
- containers
|
- containers
|
||||||
|
- text
|
||||||
|
- scientific
|
||||||
|
|
||||||
executables:
|
executables:
|
||||||
aoc24:
|
aoc24:
|
||||||
|
|
44
src/Day1.hs
44
src/Day1.hs
|
@ -2,7 +2,51 @@
|
||||||
|
|
||||||
module Day1 where
|
module Day1 where
|
||||||
|
|
||||||
|
-- import Debug.Trace
|
||||||
|
|
||||||
|
import qualified Data.Attoparsec.Text as P
|
||||||
|
import qualified Data.Text.IO as T
|
||||||
|
import Data.Scientific (coefficient)
|
||||||
|
import Data.List (sort)
|
||||||
|
import Data.Bifunctor (bimap)
|
||||||
|
import Data.Either (fromRight)
|
||||||
|
|
||||||
|
parseInput :: P.Parser [(Integer,Integer)]
|
||||||
|
parseInput = parseLine `P.sepBy` P.endOfLine
|
||||||
|
|
||||||
|
parseLine :: P.Parser (Integer,Integer)
|
||||||
|
parseLine = do
|
||||||
|
num1 <- coefficient <$> P.scientific
|
||||||
|
_ <- P.many1 P.space
|
||||||
|
num2 <- coefficient <$> P.scientific
|
||||||
|
pure (num1,num2)
|
||||||
|
|
||||||
|
-- calculating distance
|
||||||
|
solveA :: [(Integer,Integer)] -> Integer
|
||||||
|
solveA = sum
|
||||||
|
. fmap (\(x,y) -> abs (y-x))
|
||||||
|
. uncurry zip
|
||||||
|
. bimap sort sort
|
||||||
|
. unzip
|
||||||
|
|
||||||
|
-- calculating similarity score
|
||||||
|
solveB :: [(Integer,Integer)] -> Integer
|
||||||
|
solveB xs = sum ys
|
||||||
|
where
|
||||||
|
ys = uncurry similarity $ unzip xs
|
||||||
|
similarity as bs = map go as
|
||||||
|
where
|
||||||
|
-- Find how many occurences n of a in bs
|
||||||
|
-- Return a*n
|
||||||
|
go :: Integer -> Integer
|
||||||
|
go a = a * toInteger (length (filter (== a) bs))
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
|
_input <- T.readFile "inputs/day1-example.input"
|
||||||
|
input <- T.readFile "inputs/day1.input"
|
||||||
putStrLn "Part 1"
|
putStrLn "Part 1"
|
||||||
|
let xs = fromRight [] $ P.parseOnly parseInput input
|
||||||
|
print $ solveA xs
|
||||||
putStrLn "Part 2"
|
putStrLn "Part 2"
|
||||||
|
print $ solveB xs
|
||||||
|
|
Loading…
Reference in a new issue