From 0038d22c5b1dd11c2ab28db67c659d2656b96c33 Mon Sep 17 00:00:00 2001
From: Daniele Fucini <dfucini@gmail.com>
Date: Sat, 7 Dec 2024 15:33:03 +0100
Subject: [PATCH] Day 7, Part 2

---
 Day7/puzzle2.hs | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 Day7/puzzle2.hs

diff --git a/Day7/puzzle2.hs b/Day7/puzzle2.hs
new file mode 100644
index 0000000..164f63b
--- /dev/null
+++ b/Day7/puzzle2.hs
@@ -0,0 +1,27 @@
+import Data.List (transpose)
+import Data.List.Split (splitOn)
+
+type Equation = (Int, [Int])
+
+concatInt :: Int -> Int -> Int
+concatInt x y = read $ show x ++ show y
+
+isSolvable :: Int -> Equation -> Bool
+isSolvable cur (result, []) = cur == result
+isSolvable cur (result, [x]) = cur + x == result || cur * x == result || cur `concatInt` x == result
+isSolvable cur (result, x:y:ys) = isSolvable (cur + x + y) (result, ys)
+                                  || isSolvable ((cur + x) * y) (result, ys)
+                                  || isSolvable ((cur + x) `concatInt` y) (result, ys)
+                                  || isSolvable (cur * x + y) (result, ys)
+                                  || isSolvable (cur * x * y) (result, ys)
+                                  || isSolvable ((cur * x) `concatInt` y) (result, ys)
+                                  || isSolvable ((cur `concatInt` x) + y) (result, ys)
+                                  || isSolvable ((cur `concatInt` x) * y) (result, ys)
+                                  || isSolvable ((cur `concatInt` x) `concatInt` y) (result, ys)
+
+main = do
+    [x, y] <- transpose . map (splitOn ":") . lines <$> readFile "day7.txt"
+    let results = map read x
+        values = map read <$> map words y
+        equations = zip results values
+    print . sum . map fst $ filter (isSolvable 0) equations