aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuchen Pei <me@ypei.me>2017-12-01 12:05:49 +0100
committerYuchen Pei <me@ypei.me>2017-12-01 12:05:49 +0100
commite1e59998c9b18ad262ddc3efbfa1c5bb972b86f1 (patch)
tree3ecf42c3153ad7079d709d79df03e2e1a5188e21
first commit
-rw-r--r--Puzzle1.hs25
-rw-r--r--Puzzle1Better.hs5
2 files changed, 30 insertions, 0 deletions
diff --git a/Puzzle1.hs b/Puzzle1.hs
new file mode 100644
index 0000000..dc39b61
--- /dev/null
+++ b/Puzzle1.hs
@@ -0,0 +1,25 @@
+import Data.Char (digitToInt)
+
+solve1 :: [Char] -> Int
+solve1 xs = let ys = digitToInt <$> xs in firstAndLast ys + solve' ys
+
+solve' :: [Int] -> Int
+solve' [] = 0
+solve' [x] = 0
+solve' (x:y:xs) = if x == y then x + solve' (y:xs) else solve' (y:xs)
+
+firstAndLast :: [Int] -> Int
+firstAndLast [] = 0
+firstAndLast [x] = 0
+firstAndLast xs = if head xs == last xs then head xs else 0
+
+splitInput :: [Int] -> ([Int], [Int])
+splitInput xs = splitAt (length xs `div` 2) xs
+
+sumSame :: ([Int], [Int]) -> Int
+sumSame ([], _) = 0
+sumSame (_, []) = 0
+sumSame (x:xs, y:ys) = if x == y then x * 2 + sumSame (xs, ys) else sumSame (xs, ys)
+
+solve2 :: [Char] -> Int
+solve2 xs = sumSame $ splitInput $ digitToInt <$> xs
diff --git a/Puzzle1Better.hs b/Puzzle1Better.hs
new file mode 100644
index 0000000..d8d0155
--- /dev/null
+++ b/Puzzle1Better.hs
@@ -0,0 +1,5 @@
+import Data.Char (digitToInt)
+
+solve n xs = sum $ zipWith (\a b -> if a == b then a else 0) xs (drop n $ cycle xs)
+solve1 xs = solve 1 (digitToInt <$> xs)
+solve2 xs = solve ((length xs) `div` 2) (digitToInt <$> xs)