aboutsummaryrefslogtreecommitdiff
path: root/Puzzle17.hs
diff options
context:
space:
mode:
authorYuchen Pei <me@ypei.me>2017-12-17 11:19:35 +0100
committerYuchen Pei <me@ypei.me>2017-12-17 11:19:35 +0100
commit8c64712575451975c0418958d97687229a983741 (patch)
tree42c5aeb8bf744df84acd382c63580e2eadc5b9fe /Puzzle17.hs
parent892e5a8ac9cebf916926d74f64d402088f84430b (diff)
finished Day 17 part1
- part 2 crashes the computer
Diffstat (limited to 'Puzzle17.hs')
-rw-r--r--Puzzle17.hs28
1 files changed, 28 insertions, 0 deletions
diff --git a/Puzzle17.hs b/Puzzle17.hs
new file mode 100644
index 0000000..ff2d0d7
--- /dev/null
+++ b/Puzzle17.hs
@@ -0,0 +1,28 @@
+insert :: Int -> Int -> [Int] -> [Int]
+insert k x xs = let (ys, zs) = splitAt k xs in ys ++ (x:zs)
+
+step :: Int -> ([Int], Int, Int) -> ([Int], Int, Int)
+step n (xs, pos, l) = let newpos = (pos + n) `rem` l + 1 in (insert newpos l xs, newpos, l + 1)
+
+step' :: Int -> (Int, Int, Int) -> (Int, Int, Int)
+step' n (x, pos, l) = let newpos = (pos + n) `rem` l + 1 in
+ (if newpos == 1 then l else x, newpos, l + 1)
+
+f :: Int -> Int -> ([Int], Int, Int)
+f n m = foldl1 (.) (replicate m (step n)) ([0], 0, 1)
+
+f' :: Int -> Int -> (Int, Int, Int)
+f' n m = foldl1 (.) (replicate m (step' n)) (-1, 0, 1)
+
+solve1 :: Int -> Int
+solve1 n = let (xs, pos, l) = f n 2017 in xs !! (pos + 1)
+
+solve2 :: Int -> Int
+solve2 n = let (x, pos, l) = f' n 50000000 in x
+
+input0 :: Int
+input0 = 3
+input :: Int
+input = 354
+
+main = (putStrLn . show . solve2) input