solve Day04 in python

This commit is contained in:
wieerwill 2023-12-03 18:44:51 +01:00
parent 8deb16f409
commit 717bcc15e3
5 changed files with 1155 additions and 0 deletions

57
Day04/README.md Normal file
View File

@ -0,0 +1,57 @@
# Day 4: Camp Cleanup
## Part One
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?
## 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?

1000
Day04/input.txt Normal file

File diff suppressed because it is too large Load Diff

46
Day04/python/solution1.py Normal file
View File

@ -0,0 +1,46 @@
def parse_range(range_str):
"""Parse a range string into start and end integers."""
start, end = map(int, range_str.split('-'))
return start, end
def is_contained(range1, range2):
"""Check if range1 is fully contained within range2."""
start1, end1 = range1
start2, end2 = range2
return start2 <= start1 and end1 <= end2
def count_full_containments(file_path):
"""Count how many times one range in a pair fully contains the other."""
count = 0
try:
with open(file_path, 'r') as file:
for line in file:
range1_str, range2_str = line.strip().split(',')
range1 = parse_range(range1_str)
range2 = parse_range(range2_str)
if is_contained(range1, range2) or is_contained(range2, range1):
count += 1
except FileNotFoundError:
print(f"Error: File not found - {file_path}")
except ValueError:
print(f"Error: Invalid format in line - {line}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
return count
def run_test():
"""Run tests using test.txt and assert the expected outcomes."""
test_result = count_full_containments('../test.txt')
print(f"Test Result: {test_result}")
assert test_result == 2, f"Test failed: Expected 2, got {test_result}"
print("Test passed successfully.")
def main():
"""Main function to run the test and then process input.txt."""
run_test()
result = count_full_containments('../input.txt')
print(f"Result from input.txt: {result}")
if __name__ == "__main__":
main()

46
Day04/python/solution2.py Normal file
View File

@ -0,0 +1,46 @@
def parse_range(range_str):
"""Parse a range string into start and end integers."""
start, end = map(int, range_str.split('-'))
return start, end
def has_overlap(range1, range2):
"""Check if range1 overlaps with range2."""
start1, end1 = range1
start2, end2 = range2
return start1 <= end2 and start2 <= end1
def count_overlaps(file_path):
"""Count how many pairs have overlapping ranges."""
count = 0
try:
with open(file_path, 'r') as file:
for line in file:
range1_str, range2_str = line.strip().split(',')
range1 = parse_range(range1_str)
range2 = parse_range(range2_str)
if has_overlap(range1, range2):
count += 1
except FileNotFoundError:
print(f"Error: File not found - {file_path}")
except ValueError:
print(f"Error: Invalid format in line - {line}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
return count
def run_test():
"""Run tests using test.txt and assert the expected outcomes."""
test_result = count_overlaps('../test.txt')
print(f"Test Result: {test_result}")
assert test_result == 4, f"Test failed: Expected 4, got {test_result}"
print("Test passed successfully.")
def main():
"""Main function to run the test and then process input.txt."""
run_test()
result = count_overlaps('../input.txt')
print(f"Result from input.txt: {result}")
if __name__ == "__main__":
main()

6
Day04/test.txt Normal file
View File

@ -0,0 +1,6 @@
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8