summaryrefslogtreecommitdiff
path: root/2018/aoc2018-d25.py
diff options
context:
space:
mode:
Diffstat (limited to '2018/aoc2018-d25.py')
-rw-r--r--2018/aoc2018-d25.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/2018/aoc2018-d25.py b/2018/aoc2018-d25.py
new file mode 100644
index 0000000..37367df
--- /dev/null
+++ b/2018/aoc2018-d25.py
@@ -0,0 +1,69 @@
+#advent of code 2018
+#day 25
+#part 1
+
+#at first seemed really easy, then it got a bit more complex
+#but then again it seemed easy again
+#it just required a bit more thought to put into
+#could probably be bit more optimized, especially with Constellations variable
+#which could be a simple counter instead of a list, but w/e
+
+f = open("input.txt",'r');
+Testing = False;
+#Testing = True;
+if Testing:
+ f.close();
+ f = open("testinput.txt",'r');
+
+class spacepoint:
+ def __init__( self, coords ):
+ self.Coords = coords;
+ self.Adjacent = [];
+ self.Visited = False;
+
+ def manh_dist(self, OtherPoint): #calculate manhattan distance from self to OtherPoint
+ m = 0;
+ m += abs(self.Coords[0] - OtherPoint[0]);
+ m += abs(self.Coords[1] - OtherPoint[1]);
+ m += abs(self.Coords[2] - OtherPoint[2]);
+ m += abs(self.Coords[3] - OtherPoint[3]);
+ return m;
+ #add all points from the grid that are within range to the "Adjacent" property
+ def get_adjacent(self, grid):
+ for g in grid:
+ if self == grid[g]: continue;
+ if (self.manh_dist(grid[g].Coords) <= 3):
+ self.Adjacent.append(g);
+ #recursive function(method) to make a list of all points that are in the same constellation
+ #"Visited" property prevents an infinite loop
+ def Find_Subset(self, grid, subset):
+ self.Visited = True;
+ subset.extend(self.Adjacent);
+ for n in self.Adjacent:
+ if grid[n].Visited: continue;
+ subset = grid[n].Find_Subset(grid, subset);
+ return subset;
+
+ def __str__(self):
+ return f'{self.Coords}';
+
+#parse input into the program
+FixedPoints = {};
+for l in f:
+ l = "(" + l + ")";
+ p = eval(l);
+ FixedPoints.update({p:spacepoint(p)});
+f.close();
+
+#calculate neighbouring points for each point from input
+for p in FixedPoints:
+ FixedPoints[p].get_adjacent(FixedPoints);
+
+#find all constellations
+Constellations = [];
+for p in FixedPoints:
+ if FixedPoints[p].Visited: continue;
+ Constellations.append(len(set(FixedPoints[p].Find_Subset(FixedPoints, [p]))));
+
+part1 = len(Constellations);
+print("part 1 = ", part1);