diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-12-17 08:43:53 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-12-17 08:44:25 +0100 |
commit | 53c0e9c38422f3cd5cf567bd8a7d2a8cdae66be8 (patch) | |
tree | 988f1aa89405388cfa87fc1edfc394ff39fd1a61 /2017 | |
parent | 5f6c480073be6f69e0e0f1241ac80e26245dd7a7 (diff) |
Day 17
You want to compile this for part 2. Inefficient, but works. Reusing
part 1 was so inefficient that it blew up my memory.
Diffstat (limited to '2017')
-rw-r--r-- | 2017/17.hs | 37 | ||||
-rw-r--r-- | 2017/17.in | 1 |
2 files changed, 38 insertions, 0 deletions
diff --git a/2017/17.hs b/2017/17.hs new file mode 100644 index 0000000..7dbe55b --- /dev/null +++ b/2017/17.hs @@ -0,0 +1,37 @@ +import Control.Monad +import Data.List hiding (insert) +import Data.Maybe + + +data State = State Int [Int] + +initState :: State +initState = State 1 [0] + +step :: Int -> State -> State +step stepsize (State cur arr) = State cur (take (length arr) $ drop stepsize $ cycle arr) + +insert :: State -> State +insert (State cur (hd:tl)) = State (cur+1) (cur : tl ++ [hd]) + +data State2 = State2 {s2Len :: Int, s2Cur :: Int, s2Value :: Int} + +initState2 :: State2 +initState2 = State2 1 0 0 + +step2 :: Int -> State2 -> State2 +step2 stepsize (State2 len cur val) = State2 len ((cur + stepsize) `mod` len) val + +insert2 :: State2 -> State2 +insert2 (State2 len 0 val) = State2 (len+1) 1 len +insert2 (State2 len cur val) = State2 (len+1) (cur+1) val + +main :: IO () +main = do + stepsize <- liftM read (readFile "17.in") + + let State _ end = iterate (insert . step stepsize) initState !! 2017 + print $ end !! 1 + + let end2 = iterate (insert2 . step2 stepsize) initState2 !! 50000000 + print $ s2Value end2 diff --git a/2017/17.in b/2017/17.in new file mode 100644 index 0000000..aef2e27 --- /dev/null +++ b/2017/17.in @@ -0,0 +1 @@ +349 |