示例#1
0
def part_two(data):
    basins = set()
    global_seen = set()
    for y, row in enumerate(data):
        for x, v in enumerate(row):
            cell = Cell(x, y, v)
            if cell in global_seen:
                continue
            basin = explore_basin(cell, data, set())
            if basin:
                basins.add(frozenset(basin))
                global_seen.update(basin)
    top_three = []
    for basin in basins:
        size = len(basin)
        if len(top_three) < 3:
            top_three.append(size)
        elif size > min(top_three):
            top_three.remove(min(top_three))
            top_three.append(size)

    return reduce(lambda a, b: a * b, top_three, 1)


if __name__ == "__main__":
    for puzzle in ("sample", 1):
        data = get_input(__file__, puzzle=puzzle, coerce=parse)
        print(f"Part 1: Input {puzzle}, {part_one(data)}")
        print(f"Part 2: Input {puzzle}, {part_two(data)}")

示例#2
0
#!/usr/bin/env python3

from lib_inputs import get_input


def part_one(data):
    prev = data[0]
    asc_count = 0
    for value in data[1:]:
        asc_count += bool(value - prev > 0)
        prev = value

    return asc_count


def part_two(data):
    prev = data[0:3]
    asc_count = 0
    for value in data[3:]:
        current = prev[1:] + [value]
        asc_count += bool(sum(current) - sum(prev) > 0)
        prev = current

    return asc_count


for puzzle in ("sample", 1):
    data = get_input(1, puzzle=puzzle, coerce=int)
    print(f"Part 1: Input {puzzle}, {part_one(data)}")
    print(f"Part 2: Input {puzzle}, {part_two(data)}")
示例#3
0
def play_bingo(numbers, boards, first=True):
    winners = set()
    seen = set()
    for number in numbers:
        for i, board in enumerate(boards):
            seen.add(number)
            if board.has_bingo(seen):
                winners.add(i)
                if first or len(winners) == len(boards):
                    return board, number, seen


def part_one(numbers, boards):
    winning_board, number, seen = play_bingo(numbers, boards)
    print(winning_board.sum_of_not_seen(seen), int(number))
    return winning_board.sum_of_not_seen(seen) * int(number)


def part_two(numbers, boards):
    winning_board, number, seen = play_bingo(numbers, boards, first=False)
    print(winning_board.sum_of_not_seen(seen), int(number))
    return winning_board.sum_of_not_seen(seen) * int(number)


for puzzle in ("sample", 1):
    data = get_input(4, puzzle=puzzle, coerce=str)
    numbers, boards = parse(data)
    print(f"Part 1: Input {puzzle}, {part_one(numbers, boards)}")
    print(f"Part 2: Input {puzzle}, {part_two(numbers, boards)}")
示例#4
0
        if self.y1 == self.y2:
            p.extend(map(lambda v: (v, self.y1), safe_range(self.x1, self.x2)))

        if diagonal and self.x1 != self.x2 and self.y1 != self.y2:
            p.extend(
                zip(safe_range(self.x1, self.x2), safe_range(self.y1,
                                                             self.y2)))

        return p

    @staticmethod
    def from_str(s):
        return Line(*map(int, [
            item for sublist in [s2.split(",") for s2 in s.split(" -> ")]
            for item in sublist
        ]))


def part_one_or_two(data, include_diagonal):
    points = defaultdict(int)
    for line in data:
        for point in line.points(diagonal=include_diagonal):
            points[point] += 1
    return len([v for v in points.values() if v >= 2])


for puzzle in ("sample", 1):
    data = get_input(5, puzzle=puzzle, coerce=Line.from_str)
    print(f"Part 1: Input {puzzle}, {part_one_or_two(data, False)}")
    print(f"Part 2: Input {puzzle}, {part_one_or_two(data, True)}")
示例#5
0
        split(added)
    return added


def pop_pop(number):
    if isinstance(number, list):
        first = number[0] if isinstance(number[0], int) else pop_pop(number[0])
        second = number[1] if isinstance(number[1], int) else pop_pop(
            number[1])

        return 3 * first + 2 * second
    return number


def part_one(data):
    data = map(json.loads, data)
    single_num = reduce(workit, data)
    #print("reduced", single_num)
    return pop_pop(single_num)


def part_two(data):
    return max(map(part_one, itertools.permutations(data, 2)))


if __name__ == "__main__":
    for puzzle in ("sample", 1):
        for f in (part_one, part_two):
            data = get_input(__file__, puzzle=puzzle)
            print(f"{f.__name__}: Input {puzzle}, {f(data)}")
示例#6
0
    pos, depth = 0, 0
    for direction, scalar in data:
        if direction == "forward":
            pos += scalar
        elif direction == "up":
            depth -= scalar
        else:
            depth += scalar

    return pos * depth


def part_two(data):
    pos, depth, aim = 0, 0, 0
    for direction, scalar in data:
        if direction == "forward":
            pos += scalar
            depth += aim * scalar
        elif direction == "up":
            aim -= scalar
        else:
            aim += scalar

    return pos * depth


for puzzle in ("sample", 1):
    data = get_input(2, puzzle=puzzle, coerce=parse)
    print(f"Part 1: Input {puzzle}, {part_one(data)}")
    print(f"Part 2: Input {puzzle}, {part_two(data)}")