From 89ad5dccf3365bb02d2d8d2deffd3865ada5bc66 Mon Sep 17 00:00:00 2001 From: Maya Herrscher Date: Thu, 9 Dec 2021 11:25:41 +0100 Subject: [PATCH] Add alternative solution for day 9 --- AoC2021/code/AoC09B.py | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 AoC2021/code/AoC09B.py diff --git a/AoC2021/code/AoC09B.py b/AoC2021/code/AoC09B.py new file mode 100755 index 0000000..9dbd51c --- /dev/null +++ b/AoC2021/code/AoC09B.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 + +import sys +from operator import mul +from functools import reduce + +def adj(mp, x, y): + adj = {} + if x-1 > -1: adj[(-1,0)] = mp[x-1][y] + if x+1 < len(mp): adj[(1,0)] = mp[x+1][y] + if y-1 > -1: adj[(0,-1)] = mp[x][y-1] + if y+1 < len(mp[0]): adj[(0,1)] = mp[x][y+1] + return adj + +def risk(mp, x, y): + ad = adj(mp, x, y).values() + if all(map(lambda i: i > mp[x][y], ad)): + bas[(x,y)] = 0 + return mp[x][y] + 1 + else: return 0 + +def basin(mp, x, y): + nex = min(adj(mp, x, y).items(), key=lambda i: i[1]) + if (x,y) in bas: (i,j) = (x,y) + elif (x,y) in mem: (i,j) = mem[(x,y)] + else: + (i,j) = basin(mp, x+nex[0][0], y+nex[0][1]) + return (i,j) + bas[(i,j)] += 1 + return (i,j) + +if __name__ == '__main__': + m = [[int(i) for i in l] for l in open(sys.argv[1]).read().strip('\n\n').split('\n')] + + bas,mem = {},{} + # challenge 1 + res1 = str(sum([sum([risk(m, x, y) for y in range(len(m[0]))]) for x in range(len(m))])) + print("challenge 1:" +"\n" + res1 + "\n") + + # challenge 2 + ([([basin(m, x, y) for y in range(len(m[0])) if m[x][y] < 9]) for x in range(len(m))]) + res2 = str(reduce(mul, sorted(bas.values(), reverse=True)[0:3])) + print("challenge 2:" +"\n" + res2 + "\n") +