13.py
1 from lib import * 2 3 input = read_input(2021, 13) 4 5 6 dots = {tuple(map(int, line.split(","))) for line in input.split("\n\n")[0].splitlines()} 7 8 9 line = input.split("\n\n")[1].splitlines()[0] 10 11 c, n = re.match(r"^fold along (.)=(\d+)$", line).groups() 12 13 n = int(n) 14 15 dots = {(min(x, 2 * n - x) if c == "x" else x, min(y, 2 * n - y) if c == "y" else y) for x, y in dots} 16 17 18 print(len(dots)) 19 20 21 dots = {tuple(map(int, line.split(","))) for line in input.split("\n\n")[0].splitlines()} 22 23 for line in input.split("\n\n")[1].splitlines(): 24 c, n = re.match(r"^fold along (.)=(\d+)$", line).groups() 25 26 n = int(n) 27 28 dots = {(min(x, 2 * n - x) if c == "x" else x, min(y, 2 * n - y) if c == "y" else y) for x, y in dots} 29 30 out = "" 31 32 n = 0 33 34 while True: 35 k = 0 36 37 for i in range(5 * n, 5 * n + 4): 38 for j in range(6): 39 k <<= 1 40 41 k |= (i, j) in dots 42 43 if not k: 44 break 45 46 out += { 47 0b011111100100100100011111: "A", 48 0b111111101001101001010110: "B", 49 0b011110100001100001010010: "C", 50 0b111111101001101001100001: "E", 51 0b111111101000101000100000: "F", 52 0b011110100001100101010111: "G", 53 0b111111001000001000111111: "H", 54 0b000010000001100001111111: "J", 55 0b111111001000010110100001: "K", 56 0b111111000001000001000001: "L", 57 0b111111100100100100011000: "P", 58 0b111111100100100110011001: "R", 59 0b111110000001000001111110: "U", 60 0b100011100101101001110001: "Z", 61 }.get(k, "?") 62 63 n += 1 64 65 print(out)