Instantly share code, notes, and snippets.

antoinedelia/_aoc2022.md

Last active December 4, 2023 15:26
Show Gist options
• Save antoinedelia/0d271370a73c24de4d01b682da86a650 to your computer and use it in GitHub Desktop.
Things I learned during Advent of Code 2022
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 from itertools import accumulate my_dir = ["/", "mydir/", "my_other_dir/", "test.txt"] for n in accumulate(my_dir): print(n) # / # /mydir/ # /mydir/my_other_dir/ # /mydir/my_other_dir/test.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Quick dict to find value of a letter from string import ascii_letters MAP_LETTER_PRIORITY = {} for i, letter in enumerate(ascii_letters, start=1): MAP_LETTER_PRIORITY[letter] = i # a -> 1 # b -> 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Calculate a BFS def bfs(grid, start): queue = collections.deque([[start]]) seen = set() while queue: path = queue.popleft() x, y = path[-1] if grid[y][x] == goal: return path for x2, y2 in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): if 0 <= x2 < width and 0 <= y2 < height and can_move(grid[y][x], grid[y2][x2]) and (x2, y2) not in seen: queue.append(path + [(x2, y2)]) seen.add((x2, y2))
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 import functools f = {} f["AA"] = 1 f["BB"] = 2 f["CC"] = 7 g = {} g["AA"] = ["BB", "CC"] g["BB"] = ["AA", "CC"] g["CC"] = ["BB", "AA"] @functools.lru_cache(maxsize=None) def maxflow(cur, opened, min_left): if min_left <= 0: return 0 best = 0 if cur not in opened: val = (min_left - 1) * f[cur] cur_opened = tuple(sorted(opened + (cur,))) for adj in g[cur]: if val != 0: best = max(best, val + maxflow(adj, cur_opened, min_left - 2)) best = max(best, maxflow(adj, opened, min_left - 1)) return best result = maxflow("AA", (), 30) print(result)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # To iterate on input file # \$ python a.py < input.txt # If file is a one-line string for c in input(): print(c) # If file is multilines for line in open(0).read().splitlines(): print(line)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 message = "00011100" result = ["".join(g) for k, g in groupby(c)] print(result) # ["000", "111", "00"]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Instead of point = (5, 7) x, y = point[0], point[1] # Imaginary numbers point = 5 + 7j x, y = point.real, point.imag
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 s = "root = 3 + 2" exec(s) print(locals()["root"]) # 5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 a = 4 biggest = 0 # Instead of if a > biggest: biggest = a # Just do biggest = max(biggest, a)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Modular arithmetics # You can divide all numbers by their lcm (least common multiple) to keep numbers small math.lcm(2, 5, 6) # 30
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Quickly check neighbours in grid # Instead of if x, y+1 == "X": win() elif x+1, y == "X": win() elif x, y-1 == "X": win() elif x-1, y == "X": win() # Just do dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)] for dx, dy in dirs: new_x = x + dx new_y = y + dy if (new_x, new_y) == (5, 5): win()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Quickly find numbers in string import re result = [int(s) for s in re.findall(r"\b\d+\b", "dalue, 2 45")] print(result) # [2, 45] result = list(map(int, re.findall(r"\d+", "dalue, truc2sd 45"))) print(result) # [2, 45] # Also catch negative numbers result = list(map(int, re.findall(r"-?\d+", "dalue, truc2sd 45 -3"))) print(result) # [2, 45, -3] # Find 4-letters words result = re.findall(r"[\w]{4}", "2 cats and 3 dogs") print(result) # ["cats", "dogs"]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Overlap sets a = set([1, 2, 3]) b = set([2, 3, 4]) print(a & b) # {2, 3} print(a | b) # {1, 2, 3, 4}
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 from sympy.solvers import solve from sympy import Symbol x = Symbol("x") print(solve("3*x - 3", x)[0]) # 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Easily add an element to a tuple x = 1, 1, 1 x += (3,) print(x) # (1, 1, 1, 3)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 # Iterate two items at a time, sliding a = [1, 2, 3, 4, 5, 6, 7, 8, 9] for b, c in zip(a, a[1:]): print(b, c) # 1, 2 # 2, 3 # ... # In Python 3.10, you can even use itertools.pairwise from itertools import pairwise for b, c in pairwise(a): print(b, c) for j, k, l in zip(*[a[i:] for i in range(3)]): print(j, k, l) my_str = "abcdefghijklmnopqrstuvwxyz" for x in range(4, len(my_str)): print(my_str[x - 4:x]) # abcd # bcde # ....