X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent17%2Fadvent17leaky.hs;fp=src%2Fadvent17%2Fadvent17leaky.hs;h=6745c61587cb8273f712d72392f31afba63f5ba9;hb=9ce2b21f9734aa6e51186d2cc0075083a5864155;hp=0000000000000000000000000000000000000000;hpb=fc23edeb0e66a61d640dfeaffd5a274a63acf8c8;p=advent-of-code-17.git diff --git a/src/advent17/advent17leaky.hs b/src/advent17/advent17leaky.hs new file mode 100644 index 0000000..6745c61 --- /dev/null +++ b/src/advent17/advent17leaky.hs @@ -0,0 +1,47 @@ +{-# LANGUAGE NegativeLiterals #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE NegativeLiterals #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE BangPatterns #-} + +import Prelude hiding ((++)) +import Data.Vector.Unboxed ((!), (++)) +import qualified Data.Vector.Unboxed as V +import qualified Data.List as L + +type RingBuffer = V.Vector Int + +initialStepSize :: Int +initialStepSize = 366 + +initialRingBuffer :: RingBuffer +initialRingBuffer = V.singleton 0 + + +main :: IO () +main = do + print $ part1 initialStepSize 2017 + print $ part2 initialStepSize 50000000 + + +part1 n k = (!1) $! last $! take k $! L.unfoldr ringBufferUnfolder (1, n, initialRingBuffer) + + +part2 n k = finalBuffer!targetLoc + where finalBuffer = last $! take k $! L.unfoldr ringBufferUnfolder (1, n, initialRingBuffer) + zeroLoc = V.head $ V.elemIndices 0 finalBuffer + targetLoc = (zeroLoc + 1) `rem` (V.length finalBuffer) + + +updateRingBuffer nextValue stepSize buffer = (buffer', stepSize) + where !nextPos = (stepSize + 1) `rem` V.length buffer + (!start, !end) = V.splitAt nextPos buffer + !buffer' = V.cons nextValue $ end ++ start + +ringBufferUnfolder :: (Int, Int, RingBuffer) -> Maybe (RingBuffer, (Int, Int, RingBuffer)) +ringBufferUnfolder (nextValue, stepSize, buffer) = Just (buffer', (nextValue + 1, stepSize', buffer')) + where (!buffer', !stepSize') = updateRingBuffer nextValue stepSize buffer \ No newline at end of file