/ Python / 2021 / 13.py
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)