Almost there

This commit is contained in:
Martin Potier 2020-12-11 00:17:54 +02:00
parent fec46e87e0
commit a1a4a6fb52

View file

@ -4,12 +4,13 @@
#! nix-shell -i "ghcid -c 'ghci' -T main" #! nix-shell -i "ghcid -c 'ghci' -T main"
{-# OPTIONS_GHC -Wall -Wincomplete-uni-patterns #-} {-# OPTIONS_GHC -Wall -Wincomplete-uni-patterns #-}
{-# OPTIONS_GHC -Wno-unused-top-binds -Wno-unused-imports #-} {-# OPTIONS_GHC -Wno-unused-top-binds -Wno-unused-imports -Wno-type-defaults #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
import Data.List
import Data.Monoid
import Debug.Trace (trace) import Debug.Trace (trace)
import Text.Pretty.Simple import Text.Pretty.Simple
import Data.List
smallExample :: [Int] smallExample :: [Int]
smallExample = [16,10,15,5,1,11,7,19,6,12,4] smallExample = [16,10,15,5,1,11,7,19,6,12,4]
@ -23,19 +24,59 @@ solvePart1 xs = finally
$ span (== 1) $ span (== 1)
$ sort $ sort
$ map (\(x,y) -> y - x) $ map (\(x,y) -> y - x)
$ zip (0:sorted) sorted $ zip (0:sorted) (sorted ++ [l+3])
where
l = last sorted
sorted = sort xs
finally (x,y) = length x * length y
--------------------------------------------------------------------------------
-- 1 -> 1 possibility
-- 1 1 -> 2 poss
-- 1 1 1 -> 4 poss
-- 1 1 1 1 -> 6 poss
-- 1 1 1 1 1 -> 8 poss
--
--------------------------------------------------------------------------------
cleanup :: [[Int]] -> [[Int]]
cleanup = filter (\v -> (any (/= 3) v) && (length v > 1))
est :: [[Int]] -> [Int]
est = map combinations
where
combinations v = (2 ^ l) - (2 ^ (l `div` 3))
where
l = (length v) - 1
estimatePermutations :: [Int] -> Int
estimatePermutations = getProduct . foldMap Product . est . cleanup . group
distanceMap :: [Int] -> [Int]
distanceMap xs = map (\(x,y) -> y - x) $ zip (0:sorted) (sorted ++ [(last sorted)+3])
where where
sorted = sort xs sorted = sort xs
finally (x,y) = length x * ((length y)+1)
solvePart2 :: [Int] -> Int
solvePart2 = estimatePermutations . distanceMap
where
main :: IO () main :: IO ()
main = do main = do
input' <- lines <$> readFile "day10/input" input' <- lines <$> readFile "day10/input"
let input = read <$> input' let input = read <$> input'
putStrLn "Tests" putStrLn ":: Tests"
print $ smallExample print $ smallExample
print $ biggerExample print $ biggerExample
putStrLn "Day 10 - Part 1" putStrLn ":: Day 10 - Part 1"
print $ solvePart1 smallExample print $ solvePart1 smallExample
print $ solvePart1 biggerExample print $ solvePart1 biggerExample
print $ solvePart1 input print $ solvePart1 input
putStrLn ":: Tests"
putStrLn ":: Day 10 - Part 2"
print $ distanceMap smallExample
print $ solvePart2 smallExample
print $ distanceMap biggerExample
print $ (est . cleanup . group) $ distanceMap biggerExample
print $ solvePart2 biggerExample
print $ solvePart2 input