summaryrefslogtreecommitdiff
path: root/2024/aoc2024-d06.py
diff options
context:
space:
mode:
Diffstat (limited to '2024/aoc2024-d06.py')
-rw-r--r--2024/aoc2024-d06.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/2024/aoc2024-d06.py b/2024/aoc2024-d06.py
new file mode 100644
index 0000000..e5da9b4
--- /dev/null
+++ b/2024/aoc2024-d06.py
@@ -0,0 +1,63 @@
+#advent of code 2024
+#day 06
+#cleaned up
+
+
+grid = {};
+xMin, yMin, xMax, yMax = 0, 0, 0, 0;
+dirs = [(0,-1),(1,0),(0,1),(-1,0)];
+d = 0; #starting direction of the guard
+
+f = open("06.in","r");
+for y, l in enumerate(f):
+ yMax = max(yMax,y);
+ for x, c in enumerate(l[:-1]):
+ xMax = max(xMax,x);
+ if c == "^":
+ guard1 = (x,y); #guard position
+ guard2 = (x,y); #guard pos for part 2
+ c = ".";
+ grid[(x,y)] = c;
+f.close();
+
+visited = set();
+while True:
+ gx, gy = guard1; #split guard coordinates
+ dx, dy = dirs[d];
+ if not (xMin <= gx <= xMax)*(yMin <= gy <= yMax): break;
+ if grid.get((gx+dx,gy+dy),".") == "#":
+ d = (d+1)%4;
+ dx, dy = dirs[d];
+ visited.add(guard1);
+ guard1 = (gx+dx,gy+dy);
+
+#definition of loop: if the guard meets the same obstacle twice, then he's looping
+def bruteforce(NewPos,guard): #check if inserting in NewPos position an obstacle will create a loop
+ d = 0;
+ obstacles = set();
+ #register in set "obstacles" encountered obstacles in format: x,y,d,
+ #where d is the direction from which guard encountered the obstacle
+ ok = True
+ while True:
+ gx, gy = guard;
+ dx, dy = dirs[d];
+ if not (xMin <= gx+dy <= xMax)*(yMin <= gy+dy <= yMax):
+ ok = False; #if the guard left the grid then the new obstacle didnt work
+ break;
+ if grid.get((gx+dx,gy+dy),".") == "#" or (gx+dx,gy+dy)==NewPos:
+ d = (d+1)%4;
+ dx, dy = dirs[d];
+ if (guard,d) in obstacles: break;
+ obstacles.add((guard,d));
+ else:
+ guard = (gx+dx,gy+dy);
+ return ok;
+
+NewPlaces = set(); #store the correct possibilites in a set just in case to prevent duplicates
+for v in visited: #simulate another guard patrol for each possible new position v
+ if bruteforce(v,guard2): NewPlaces.add(v); #if he loops, +1 to score
+
+part1 = len(visited);
+part2 = len(NewPlaces);
+print("part 1 =", part1);
+print("part 2 =", part2);