Beispiel #1
0

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:
Beispiel #2
0
    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)
Beispiel #3
0
        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]
Beispiel #4
0
    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))