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)}")
#!/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)}")
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)}")
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)}")
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)}")
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)}")