diff --git a/day8/main.hs b/day8/main.hs index 52b2de3..42e874a 100755 --- a/day8/main.hs +++ b/day8/main.hs @@ -1,8 +1,10 @@ #! /usr/bin/env -S"ANSWER=42" nix-shell #! nix-shell -p ghcid #! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [pretty-simple vector containers])" -#! nix-shell -i "ghcid -c 'ghci -Wall' -T main" +#! nix-shell -i "ghcid -c 'ghci' -T main" +{-# OPTIONS_GHC -Wall -Wincomplete-uni-patterns #-} +{-# OPTIONS_GHC -Wno-unused-top-binds #-} {-# LANGUAGE OverloadedStrings #-} import Text.Pretty.Simple @@ -11,7 +13,9 @@ import Text.Pretty.Simple import Data.Vector (Vector) import Debug.Trace (trace) import Data.List (unfoldr) +import Data.IntMap.Strict (IntMap) import qualified Data.Vector as V +import qualified Data.IntMap.Strict as M data Op = OpNop | OpJmp !Int @@ -66,16 +70,29 @@ vmFromInput input = initialVM (ins input) -- Find smallest looping prefix in list of Int, returns associated pgmAccumulator solvePart1 :: VirtualMachine -> Int -solvePart1 vm = undefined vm +solvePart1 vm0 = + snd . last $ shortestCycleOn $ (\vm -> (pgmCounter vm, pgmAccumulator vm)) <$> unfoldr stepVM vm0 -- Shortest cycle in [Int] -shortestCycle :: [Int] +shortestCycle :: [Int] -> [Int] +shortestCycle ix = reverse $ go M.empty ix [] + where + go :: (IntMap ()) -> [Int] -> [Int] -> [Int] + go mem (x:_ ) ys | (mem M.!? x) /= Nothing = ys + go mem (x:xs) ys | otherwise = go (M.insert x () mem) xs (x:ys) + go _ [] ys = ys + +shortestCycleOn :: [(Int,Int)] -> [(Int,Int)] +shortestCycleOn tx = zip (shortestCycle cx) ax + where + (cx, ax) = unzip tx main :: IO () main = do putStrLn "Day 8 - Part 1" putStrLn ":: Tests" pPrint exampleData - print $ take 10 $ (\vm -> (pgmCounter vm, pgmAccumulator vm)) <$> unfoldr stepVM (vmFromInput exampleData) putStrLn ":: Solving part 1" - print $ solvePart1 (vmFromInput exampleData) + pPrint $ solvePart1 (vmFromInput exampleData) + input <- lines <$> readFile "day8/input" + pPrint $ solvePart1 (vmFromInput input) diff --git a/template.hs b/template.hs index 8b10a2f..fff129a 100755 --- a/template.hs +++ b/template.hs @@ -1,8 +1,10 @@ #! /usr/bin/env -S"ANSWER=42" nix-shell #! nix-shell -p ghcid -#! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [shower])" -#! nix-shell -i "ghcid -c 'ghci -Wall' -T main" +#! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [])" +#! nix-shell -i "ghcid -c 'ghci' -T main" +{-# OPTIONS_GHC -Wall -Wincomplete-uni-patterns #-} +{-# OPTIONS_GHC -Wno-unused-top-binds #-} {-# LANGUAGE OverloadedStrings #-} main :: IO ()