summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gusso230@student.liu.se>2019-12-24 07:22:39 +0100
committerGustav Sörnäs <gusso230@student.liu.se>2019-12-24 07:22:39 +0100
commit3b3f473c0b18e17ab74f800c3dd92209d3fc5b13 (patch)
tree886ee0a9fece00529e5c98e6cf73d887c64459b9
parentf546d8a4e55ac046ecddb00e41e72f6e599446f4 (diff)
downloadaoc-3b3f473c0b18e17ab74f800c3dd92209d3fc5b13.tar.gz
Day 24 part 1
-rw-r--r--19/input/245
-rw-r--r--19/py/d24.py130
2 files changed, 135 insertions, 0 deletions
diff --git a/19/input/24 b/19/input/24
new file mode 100644
index 0000000..0505ca8
--- /dev/null
+++ b/19/input/24
@@ -0,0 +1,5 @@
+#..##
+#.#..
+#...#
+##..#
+#..##
diff --git a/19/py/d24.py b/19/py/d24.py
new file mode 100644
index 0000000..b747986
--- /dev/null
+++ b/19/py/d24.py
@@ -0,0 +1,130 @@
+class hashdict(dict):
+ """
+ hashable dict implementation, suitable for use as a key into
+ other dicts.
+
+ >>> h1 = hashdict({"apples": 1, "bananas":2})
+ >>> h2 = hashdict({"bananas": 3, "mangoes": 5})
+ >>> h1+h2
+ hashdict(apples=1, bananas=3, mangoes=5)
+ >>> d1 = {}
+ >>> d1[h1] = "salad"
+ >>> d1[h1]
+ 'salad'
+ >>> d1[h2]
+ Traceback (most recent call last):
+ ...
+ KeyError: hashdict(bananas=3, mangoes=5)
+
+ based on answers from
+ http://stackoverflow.com/questions/1151658/python-hashable-dicts
+
+ """
+ def __key(self):
+ return tuple(sorted(self.items()))
+ def __repr__(self):
+ return "{0}({1})".format(self.__class__.__name__,
+ ", ".join("{0}={1}".format(
+ str(i[0]),repr(i[1])) for i in self.__key()))
+
+ def __hash__(self):
+ return hash(self.__key())
+ def __setitem__(self, key, value):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def __delitem__(self, key):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def clear(self):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def pop(self, *args, **kwargs):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def popitem(self, *args, **kwargs):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def setdefault(self, *args, **kwargs):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ def update(self, *args, **kwargs):
+ raise TypeError("{0} does not support item assignment"
+ .format(self.__class__.__name__))
+ # update is not ok because it mutates the object
+ # __add__ is ok because it creates a new object
+ # while the new object is under construction, it's ok to mutate it
+ def __add__(self, right):
+ result = hashdict(self)
+ dict.update(result, right)
+ return result
+
+def inside(p):
+ return 0 <= p[0] < 5 and 0 <= p[1] < 5
+
+def neighbours(p):
+ return [(p[0]+1, p[1]), (p[0]-1, p[1]), \
+ (p[0], p[1]+1), (p[0], p[1]-1)]
+
+def draw(bugs):
+ s = ""
+ for y in range(5):
+ s += "\n"
+ for x in range(5):
+ if bugs[(x,y)] == True:
+ s += "#"
+ else:
+ s += "."
+ return s
+
+def draw_nums(bugs):
+ s = ""
+ for y in range(5):
+ s += "\n"
+ for x in range(5):
+ s += str(bugs.get((x,y), 0))
+ return s
+
+def nums(bugs):
+ nums = {}
+ for y in range(5):
+ for x in range(5):
+ p = (x,y)
+ if bugs[p] == True:
+ for n in neighbours(p):
+ if inside(n):
+ nums[n] = nums.get(n, 0) + 1
+ return nums
+
+f = open("../input/24", "r").readlines()
+
+bugs = {}
+for y in range(5):
+ for x in range(5):
+ bugs[(x,y)] = (f[y][x] == "#")
+
+seen = set()
+while True:
+ h = hashdict(bugs.copy())
+ if h in seen:
+ break
+ seen.add(h)
+ new = {}
+ ns = nums(bugs)
+ for y in range(5):
+ for x in range(5):
+ p = (x,y)
+ n = ns.get(p, 0)
+ if bugs[p] == False and (n == 1 or n == 2):
+ new[p] = True
+ elif bugs[p] == True and n != 1:
+ new[p] = False
+ else:
+ new[p] = bugs[p]
+ bugs = new
+print(draw(bugs))
+
+ans = 0
+for k, v in bugs.items():
+ if v == True:
+ ans += 2**(k[1]*5 + k[0])
+print(ans)