aboutsummaryrefslogtreecommitdiff
path: root/2015/15
diff options
context:
space:
mode:
Diffstat (limited to '2015/15')
-rw-r--r--2015/15/.gitignore1
-rw-r--r--2015/15/Makefile8
-rwxr-xr-x2015/15/puzzle-1.py39
-rw-r--r--[-rwxr-xr-x]2015/15/puzzles.py (renamed from 2015/15/puzzle-2.py)26
4 files changed, 26 insertions, 48 deletions
diff --git a/2015/15/.gitignore b/2015/15/.gitignore
new file mode 100644
index 0000000..ffc46fe
--- /dev/null
+++ b/2015/15/.gitignore
@@ -0,0 +1 @@
+puzzle-[12].py
diff --git a/2015/15/Makefile b/2015/15/Makefile
new file mode 100644
index 0000000..8ada60c
--- /dev/null
+++ b/2015/15/Makefile
@@ -0,0 +1,8 @@
+all:
+ m4 -D GROUPS=5 puzzles.py | sed '/# START PART 2/,/# END PART 2/d' >puzzle-1.py
+ m4 -D GROUPS=6 puzzles.py | sed '/# START PART 1/,/# END PART 1/d' >puzzle-2.py
+ chmod +x puzzle-[12].py
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12].py
diff --git a/2015/15/puzzle-1.py b/2015/15/puzzle-1.py
deleted file mode 100755
index 806737c..0000000
--- a/2015/15/puzzle-1.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python3
-
-from math import prod
-import itertools
-import re
-
-
-def main() -> None:
- data: list[list[int]] = []
- with open("input", "r", encoding="utf-8") as f:
- for line in f.readlines():
- m = re.match(
- r"[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)",
- line,
- )
- data.append([int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))])
-
- total: int = 0
- for i in range(100):
- for j in range(100 - i):
- for k in range(100 - i - j):
- if i + j + k > 100:
- continue
- h = 100 - i - j - k
-
- parts: list[int] = []
- parts.append(data[0][0] * i + data[1][0] * j + data[2][0] * k + data[3][0] * h)
- parts.append(data[0][1] * i + data[1][1] * j + data[2][1] * k + data[3][1] * h)
- parts.append(data[0][2] * i + data[1][2] * j + data[2][2] * k + data[3][2] * h)
- parts.append(data[0][3] * i + data[1][3] * j + data[2][3] * k + data[3][3] * h)
-
- if not any(map(lambda x: x < 0, parts)):
- total = max(total, prod(parts))
-
- print(total)
-
-
-if __name__ == "__main__":
- main()
diff --git a/2015/15/puzzle-2.py b/2015/15/puzzles.py
index ec03a82..506e11f 100755..100644
--- a/2015/15/puzzle-2.py
+++ b/2015/15/puzzles.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
-from math import prod
import itertools
import re
+from math import prod
def main() -> None:
@@ -10,26 +10,34 @@ def main() -> None:
with open("input", "r", encoding="utf-8") as f:
for line in f.readlines():
m = re.match(
+ # START PART 1
+ r"[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)",
+ # END PART 1
+ # START PART 2
r"[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([\-0-9]+)[^\-0-9]+([0-9]+)",
+ # END PART 2
line,
)
- data.append(list(map(int, [m.group(i) for i in range(1, 6)])))
+ data.append(list(map(int, [m.group(i) for i in range (1, GROUPS)])))
- total: int = 0
+ total = 0
for i in range(100):
for j in range(100 - i):
for k in range(100 - i - j):
if i + j + k > 100:
continue
h = 100 - i - j - k
+ # START PART 2
if data[0][4] * i + data[1][4] * j + data[2][4] * k + data[3][4] * h != 500:
continue
-
- parts: list[int] = []
- parts.append(data[0][0] * i + data[1][0] * j + data[2][0] * k + data[3][0] * h)
- parts.append(data[0][1] * i + data[1][1] * j + data[2][1] * k + data[3][1] * h)
- parts.append(data[0][2] * i + data[1][2] * j + data[2][2] * k + data[3][2] * h)
- parts.append(data[0][3] * i + data[1][3] * j + data[2][3] * k + data[3][3] * h)
+ # END PART 2
+
+ parts = [
+ data[0][0] * i + data[1][0] * j + data[2][0] * k + data[3][0] * h,
+ data[0][1] * i + data[1][1] * j + data[2][1] * k + data[3][1] * h,
+ data[0][2] * i + data[1][2] * j + data[2][2] * k + data[3][2] * h,
+ data[0][3] * i + data[1][3] * j + data[2][3] * k + data[3][3] * h,
+ ]
if not any(map(lambda x: x < 0, parts)):
total = max(total, prod(parts))