105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
# --- Day 4: Camp Cleanup ---
|
|
|
|
# Space needs to be cleared before the last supplies can be unloaded from the
|
|
# ships, and so several Elves have been assigned the job of cleaning up
|
|
# sections of the camp. Every section has a unique ID number, and each Elf is
|
|
# assigned a range of section IDs.
|
|
|
|
# However, as some of the Elves compare their section assignments with each
|
|
# other, they've noticed that many of the assignments overlap. To try to
|
|
# quickly find overlaps and reduce duplicated effort, the Elves pair up and
|
|
# make a big list of the section assignments for each pair (your puzzle input).
|
|
|
|
# For example, consider the following list of section assignment pairs:
|
|
|
|
# 2-4,6-8
|
|
# 2-3,4-5
|
|
# 5-7,7-9
|
|
# 2-8,3-7
|
|
# 6-6,4-6
|
|
# 2-6,4-8
|
|
|
|
# For the first few pairs, this list means:
|
|
|
|
# Within the first pair of Elves, the first Elf was assigned sections 2-4
|
|
# (sections 2, 3, and 4), while the second Elf was assigned sections 6-8
|
|
# (sections 6, 7, 8).
|
|
# The Elves in the second pair were each assigned two sections.
|
|
# The Elves in the third pair were each assigned three sections: one got
|
|
# sections 5, 6, and 7, while the other also got 7, plus 8 and 9.
|
|
|
|
# This example list uses single-digit section IDs to make it easier to draw;
|
|
# your actual list might contain larger numbers. Visually, these pairs of
|
|
# section assignments look like this:
|
|
|
|
# .234..... 2-4
|
|
# .....678. 6-8
|
|
|
|
# .23...... 2-3
|
|
# ...45.... 4-5
|
|
|
|
# ....567.. 5-7
|
|
# ......789 7-9
|
|
|
|
# .2345678. 2-8
|
|
# ..34567.. 3-7
|
|
|
|
# .....6... 6-6
|
|
# ...456... 4-6
|
|
|
|
# .23456... 2-6
|
|
# ...45678. 4-8
|
|
|
|
# Some of the pairs have noticed that one of their assignments fully contains
|
|
# the other. For example, 2-8 fully contains 3-7, and 6-6 is fully contained by
|
|
# 4-6. In pairs where one assignment fully contains the other, one Elf in the
|
|
# pair would be exclusively cleaning sections their partner will already be
|
|
# cleaning, so these seem like the most in need of reconsideration. In this
|
|
# example, there are 2 such pairs.
|
|
|
|
# In how many assignment pairs does one range fully contain the other?
|
|
|
|
with open("P4.txt") as f:
|
|
section_pairs = [line for line in f.read().strip().split()]
|
|
|
|
assignment_pairs = 0
|
|
for elfs in section_pairs:
|
|
e1, e2 = [[int(x) for x in pairs.split("-")] for pairs in elfs.split(",")]
|
|
e1, e2 = {x for x in range(e1[0], e1[1] + 1)}, {
|
|
x for x in range(e2[0], e2[1] + 1)
|
|
}
|
|
if len(e1) == len(e1 | e2) or len(e2) == len(e1 | e2):
|
|
assignment_pairs += 1
|
|
|
|
print(assignment_pairs)
|
|
|
|
|
|
# --- Part Two ---
|
|
|
|
# It seems like there is still quite a bit of duplicate work planned. Instead,
|
|
# the Elves would like to know the number of pairs that overlap at all.
|
|
|
|
# In the above example, the first two pairs (2-4,6-8 and 2-3,4-5) don't
|
|
# overlap, while the remaining four pairs (5-7,7-9, 2-8,3-7, 6-6,4-6, and
|
|
# 2-6,4-8) do overlap:
|
|
|
|
# 5-7,7-9 overlaps in a single section, 7.
|
|
# 2-8,3-7 overlaps all of the sections 3 through 7.
|
|
# 6-6,4-6 overlaps in a single section, 6.
|
|
# 2-6,4-8 overlaps in sections 4, 5, and 6.
|
|
|
|
# So, in this example, the number of overlapping assignment pairs is 4.
|
|
|
|
# In how many assignment pairs do the ranges overlap?
|
|
|
|
assignment_pairs_overlaps = len(section_pairs)
|
|
for elfs in section_pairs:
|
|
e1, e2 = [[int(x) for x in pairs.split("-")] for pairs in elfs.split(",")]
|
|
e1, e2 = {x for x in range(e1[0], e1[1] + 1)}, {
|
|
x for x in range(e2[0], e2[1] + 1)
|
|
}
|
|
if len(e1 & e2) == 0:
|
|
assignment_pairs_overlaps -= 1
|
|
|
|
print(assignment_pairs_overlaps)
|