summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2024-12-13 11:47:35 +0000
committermhsn <mail@mhsn.net>2024-12-13 11:47:35 +0000
commit7ed683c4c9cd9f22a5798e1956e7ec2ba081707c (patch)
treeb076cc78beec7e2549b77d7a1edf0a2d523436ec
parentb6f8fa4e66c3ea8f1f090a3fbec12b94dc5cd858 (diff)
downloadaoc-7ed683c4c9cd9f22a5798e1956e7ec2ba081707c.tar.gz
aoc-7ed683c4c9cd9f22a5798e1956e7ec2ba081707c.zip
2024-13 python p1,p2
-rw-r--r--2024/13/python/main.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/2024/13/python/main.py b/2024/13/python/main.py
new file mode 100644
index 0000000..de31184
--- /dev/null
+++ b/2024/13/python/main.py
@@ -0,0 +1,38 @@
+import re
+from fileinput import input
+from itertools import batched
+
+lines = [line.strip() for line in input()]
+
+
+re_button = r"Button [A|B]: X\+(\d+), Y\+(\d+)"
+re_prize = r"Prize: X=(\d+), Y=(\d+)"
+
+
+def solve(machine, gold):
+ m = re.fullmatch(
+ r"Button A: X\+(\d+), Y\+(\d+)Button B: X\+(\d+), Y\+(\d+)Prize: X=(\d+), Y=(\d+)",
+ "".join(machine),
+ )
+ # 2x2 matrix solve
+ ax, ay, bx, by, px, py = map(int, m.groups())
+ if gold:
+ px += 10000000000000
+ py += 10000000000000
+ det = ax * by - ay * bx
+
+ A = (by * px - bx * py) / det
+ B = (-ay * px + ax * py) / det
+
+ # Check solutions are ints
+ if abs(int(A) - A) < 1e-7 and abs(int(B) - B) < 1e-7:
+ return 3 * int(A) + int(B)
+ else:
+ return 0
+
+
+silver = sum(solve(b, False) for b in batched(lines, 4))
+gold = sum(solve(b, True) for b in batched(lines, 4))
+
+print("silver:", silver)
+print("gold:", gold)