diff options
Diffstat (limited to '2024/aoc2024-d06.py')
-rw-r--r-- | 2024/aoc2024-d06.py | 63 |
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); |