From 12f551dbfef138880b29ba6abe4576714ae942cb Mon Sep 17 00:00:00 2001 From: blenovo Date: Sat, 2 Aug 2025 03:13:50 +0200 Subject: summer warmup sesh part 2 --- 2020/aoc2020-d17.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 2020/aoc2020-d17.py (limited to '2020/aoc2020-d17.py') diff --git a/2020/aoc2020-d17.py b/2020/aoc2020-d17.py new file mode 100644 index 0000000..d26439d --- /dev/null +++ b/2020/aoc2020-d17.py @@ -0,0 +1,72 @@ +#advent of code 2020 +#day 17 +#bruteforce bros win again +#im not sure how to calculate both parts at the same time +#since the bounds will definitely be different between 3D and 4D + +import itertools + +PocketDimension1 = set(); +PocketDimension2 = set(); +limit = 6; +PuzzleInput = open("17.in","r"); +for y,line in enumerate(PuzzleInput): + for x,c in enumerate(line[:-1]): + if c == "#": + PocketDimension1.add((x,y,0)); + PocketDimension2.add((x,y,0,0)); +PuzzleInput.close(); + +print("3D"); +for turn in range(limit): + CopiedDimension1 = set(); + bounds = []; + for i in range(3): + lo = min([p[i] for p in PocketDimension1]); + hi = max([p[i] for p in PocketDimension1]); + bounds.append([lo,hi]); + + for x in range(bounds[0][0]-1, bounds[0][1]+2): + for y in range(bounds[1][0] -1, bounds[1][1] +2): + for z in range(bounds[2][0] -1, bounds[2][1] +2): + neighbors = 0; + for dx,dy,dz in itertools.product([-1,0,1],repeat=3): + if dx==dy==dz==0 : continue; + if (x+dx,y+dy,z+dz) in PocketDimension1: neighbors+=1; + if (x,y,z) in PocketDimension1: + if 2 <= neighbors <= 3: CopiedDimension1.add((x,y,z)); + else: + if neighbors == 3: CopiedDimension1.add((x,y,z)); + + PocketDimension1 = CopiedDimension1.copy(); + print(f'turn {turn+1}/{limit}'); + +print("4D"); +for turn in range(limit): + CopiedDimension2 = set(); + bounds = []; + for i in range(4): + lo = min([p[i] for p in PocketDimension2]); + hi = max([p[i] for p in PocketDimension2]); + bounds.append([lo,hi]); + + for x in range(bounds[0][0]-1, bounds[0][1]+2): + for y in range(bounds[1][0] -1, bounds[1][1] +2): + for z in range(bounds[2][0] -1, bounds[2][1] +2): + for w in range(bounds[3][0] -1, bounds[3][1] +2): + neighbors = 0; + for dx,dy,dz,dw in itertools.product([-1,0,1],repeat=4): + if dx==dy==dz==dw==0 : continue; + if (x+dx,y+dy,z+dz,w+dw) in PocketDimension2: neighbors+=1; + if (x,y,z,w) in PocketDimension2: + if 2 <= neighbors <= 3: CopiedDimension2.add(( x,y,z,w)); + else: + if neighbors == 3: CopiedDimension2.add((x,y,z,w)); + + PocketDimension2 = CopiedDimension2.copy(); + print(f'turn {turn+1}/{limit}'); #it takes a while so im leaving this as a countdown + +p1 = len(PocketDimension1); +p2 = len(PocketDimension2); +print("part 1 =",p1); +print("part 2 =",p2); -- cgit v1.2.3