def neighbors(x, y, z): for dx, dy, dz in cubes: yield (dx + x, dy + y, dz + z) def part1(lines: List[str]) -> int: g = parse_lines(lines) for i in range(6): g = get_next(g) return len(g) submit(1, part1(lines), True) # Part 2 ################################################## def bounds2(g): res = [] for d in range(4): lo = min(x[d] for x in g) - 1 hi = max(x[d] for x in g) + 2 res.append((lo, hi)) return res def neighbors2(x, y, z, w): for dx, dy, dz, dw in quads:
for line in lines: if line.startswith("mask = "): mask = line[len("mask = "):] else: index = int(line[line.index("[") + 1:line.index("]")]) value = int(line[line.index("=") + 1:]) value = bin(value)[2:] value = "0" * (len(mask) - len(value)) + value result = "" for i in range(len(mask)): result += apply(mask[i], value[i]) mem[index] = int(result, 2) return sum(mem.values()) submit(1, part1(lines)) # Part 2 ################################################## def mask_addr(mask, index): addrn = [None] * 36 for i, (m, a) in enumerate(zip(mask, index)): if m == "0": addrn[i] = a elif m == "1": addrn[i] = "1" else: addrn[i] = "X" return "".join(addrn)
acc += n idx += 1 elif i == J: idx += n elif i == N: pass idx += 1 else: print("F") sys.exit(1) ans = acc submit(1, ans) # Part 2 ################################################## ans = float("inf") def does_loop(ps): accc = 0 seen = set() values = [accc] idx = 0 while idx < len(ps): i, n = ps[idx]
for n_i, a_i in zip(n, a): p = prod // n_i sum += a_i * mul_inv(p, n_i) * p return sum % prod def mul_inv(a, b): b0 = b x0, x1 = 0, 1 if b == 1: return 1 while a > 1: q = a // b a, b = b, a % b x0, x1 = x1 - q * x0, x0 if x1 < 0: x1 += b0 return x1 def part2(lines: List[str]) -> int: remainders = [] divisors = [] for i, x in enumerate(lines[1].split(',')): if x != "x": x = int(x) remainders.append(x - i) divisors.append(x) return chinese_remainder(divisors, remainders) submit(2, part2(lines))