summaryrefslogtreecommitdiff
path: root/2025/aoc2025-d07.py
diff options
context:
space:
mode:
authorbthink <bthink@fake.com>2025-12-07 15:59:37 +0100
committerbthink <bthink@fake.com>2025-12-07 15:59:37 +0100
commited395fe7a7fd68f6db4ea94de8fdcdcb0fac5179 (patch)
tree68048caf0328d39083e107cb19b989001389527c /2025/aoc2025-d07.py
parentf6ff66ea2da1f30303f17a2dac341411fb325881 (diff)
first week of AOC 2025
Diffstat (limited to '2025/aoc2025-d07.py')
-rw-r--r--2025/aoc2025-d07.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/2025/aoc2025-d07.py b/2025/aoc2025-d07.py
new file mode 100644
index 0000000..e72effe
--- /dev/null
+++ b/2025/aoc2025-d07.py
@@ -0,0 +1,56 @@
+#advent of code 2025
+#day 07
+part1=0;
+part2=0;
+#parsing
+grid=dict();
+Ymax=0;
+Xmax=0;
+PuzzleInput=open("07.in","r");
+for y,line in enumerate(PuzzleInput):
+ Ymax+=1;
+ for x,c in enumerate(line.replace("\n","")):
+ grid[(x,y)]=c;
+ Xmax=max(Xmax,x+1);
+ if c=="S":
+ Start=(x,y);
+ grid[(x,y)]=".";
+PuzzleInput.close();
+#solution
+total=(0,0);
+pathing=dict();
+pathing[total]=set();
+hitBottom=dict();
+splitters=set(); #encountered splitters
+beams=set([(Start,total)]);
+#recursive search
+def findTimelines(point):
+ if point in hitBottom:
+ return hitBottom[point];
+ hitBottom[point]=0;
+ for path in pathing[point]:
+ hitBottom[point]+=findTimelines(path);
+ return hitBottom[point];
+
+for step in range(0,Ymax+1,2): #every 2nd line is empty so i'm skipping it
+ newbeams=set();
+ while beams:
+ b,prev=beams.pop();
+ pathing[prev].add(b);
+ if b not in pathing: pathing[b]=set();
+ bx,by=b;
+ beam=(bx,by+2);
+ if grid.get(beam,".")=="^":
+ splitters.add(beam);
+ newbeams.add(((bx+1,by+2),(bx,by)));
+ newbeams.add(((bx-1,by+2),(bx,by)));
+ else:
+ newbeams.add(((bx,by+2),(bx,by)));
+ if by+2>Ymax and b not in hitBottom:
+ hitBottom[b]=1; #register from which points beams hit the bottom
+ beams=newbeams;
+
+part1=len(splitters);
+part2=findTimelines(Start);
+print("part 1",part1,part1==1533);
+print("part 2",part2,part2==10733529153890);