2022-12-04 - Camp Cleanup
(original .ipynb)
Day 4 puzzle input is a list of pairs of ranges which represent which sections a given elf is assigned to clean (mine is here). Part 1 involves finding how many elves were given a pair of section assignments where one assignment completely contains the other. Part 2 involves finding how many elves simply have overlapping assignments.
puzzle_input_str = open("./puzzle_input/day4.txt").read()
test_input_str = """2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8"""
def parse_range(range_str):
start, end = range_str.split("-")
return int(start), int(end)
def parse_assignment(line):
first, second = line.split(",")
return parse_range(first), parse_range(second)
def contains(assignment1, assignment2):
s1, e1 = assignment1
s2, e2 = assignment2
return s1 <= s2 and e1 >= e2
def part_one(input_str):
assignments = [parse_assignment(line) for line in input_str.splitlines()]
return sum(1 for first, second in assignments if contains(first, second) or contains(second, first))
assert 2 == part_one(test_input_str)
print("part one:", part_one(puzzle_input_str))
part one: 571
def overlaps(assignment1, assignment2):
s1, e1 = assignment1
s2, e2 = assignment2
return (s1 >= s2 and s1 <= e2) or (e1 >= s2 and e1 <= e2)
def part_two(input_str):
assignments = [parse_assignment(line) for line in input_str.splitlines()]
return sum(1 for first, second in assignments if overlaps(first, second) or overlaps(second, first))
assert 4 == part_two(test_input_str)
print("part two:", part_two(puzzle_input_str))
part two: 917