summaryrefslogtreecommitdiff
path: root/2024/aoc2024-d25.py
diff options
context:
space:
mode:
Diffstat (limited to '2024/aoc2024-d25.py')
-rw-r--r--2024/aoc2024-d25.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/2024/aoc2024-d25.py b/2024/aoc2024-d25.py
new file mode 100644
index 0000000..4f14ee6
--- /dev/null
+++ b/2024/aoc2024-d25.py
@@ -0,0 +1,55 @@
+#advent of code 2024
+#day 25
+#I'm not sure if my solution is general enough to work on modified inputs
+#like bigboys but I guess it's good enough to work on original AOC one.
+#parse schematics, decide if they are a key or a lock based on first row
+#generate the heights of each pin
+#compare each key with each lock column by column
+
+data = open("25.in","r").read().strip().split("\n\n");
+
+def getDimensions(gridraw):
+ Category = None;
+ Schematics = {};
+ xMax = 0;
+ yMax = 0;
+ for y, line in enumerate(gridraw.strip().split("\n")):
+ yMax = max(yMax,y);
+ if y == 0:
+ if line == "."*len(line): Category = "key";
+ else: Category = "loc";
+ for x, c in enumerate(line):
+ xMax = max(xMax,x);
+ Schematics[(y,x)] = c;
+ heights = [];
+ if Category == "key":
+ for x in range(xMax+1):
+ h = sum( Schematics[(y,x)]=="#" for y in range(1,yMax) );
+ heights.append(h);
+ else:
+ for x in range(xMax+1):
+ h = sum( Schematics[(y,x)]=="#" for y in range(yMax-1,0,-1) );
+ heights.append(h);
+ return Category, heights;
+
+Keyed = [];
+Locked = [];
+XMAX = 0;
+YMAX = 0;
+XMAX = len(data[0].split("\n")[0])
+YMAX = len(data[0].split("\n")) -2;
+for d in data:
+ cat, dims = getDimensions(d);
+ if cat == "key": Keyed.append(dims);
+ if cat == "loc": Locked.append(dims);
+
+part1 = 0;
+for Key in Keyed:
+ for Lock in Locked:
+ fit = True;
+ for col in range(XMAX):
+ if Key[col] + Lock[col] > YMAX: fit = False;
+ part1 += 1*fit;
+
+print("part 1 =", part1);
+