8000 AoC 2024, days 1-5 · tobiasvl/adventofcode@c18ac09 · GitHub
[go: up one dir, main page]

Skip to content

Commit c18ac09

Browse files
committed
AoC 2024, days 1-5
1 parent ddc01ea commit c18ac09

File tree

6 files changed

+251
-1
lines changed

6 files changed

+251
-1
lines changed

2024/day01/day01.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/python3
2+
def main():
3+
left, right = [], []
4+
with open('input') as f:
5+
for line in f:
6+
line = [l.strip() for l in line.split()]
7+
left.append(int(line[0]))
8+
right.append(int(line[1]))
9+
left.sort()
10+
right.sort()
11+
12+
assert(len(left) == len(right))
13+
14+
print(sum([abs(left[i] - right[i]) for i in range(len(left))]))
15+
16+
from collections import defaultdict
17+
18+
right_freq = defaultdict(int)
19+
for number in right:
20+
right_freq[number] += 1
21+
22+
print(sum([num * right_freq[num] for num in left]))
23+
24+
if __name__ == "__main__":
25+
main()

2024/day02/day02.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/python3
2+
def judge_safety(report):
3+
if report != sorted(report) and report != sorted(report, reverse=True):
4+
return False
5+
6+
for i in range(1, len(report)):
7+
diff = abs(report[i] - report[i - 1])
8+
if diff > 0 and diff < 4:
9+
pass
10+
else:
11+
return False
12+
13+
return True
14+
15+
def main():
16+
with open('input') as f:
17+
lines = [line.strip() for line in f]
18+
reports = [level.split() for level in lines]
19+
reports = [[int(level) for level in report] for report in reports]
20+
21+
print(sum([judge_safety(report) for report in reports]))
22+
23+
dampened_safe_reports = 0
24+
25+
for report in reports:
26+
if judge_safety(report):
27+
dampened_safe_reports += 1
28+
else:
29+
for i in range(len(report)):
30+
report_dampened = report[::]
31+
report_dampened.pop(i)
32+
if judge_safety(report_dampened):
33+
dampened_safe_reports += 1
34+
break
35+
print(dampened_safe_reports)
36+
37+
if __name__ == "__main__":
38+
main()

2024/day03/day03.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/python3
2+
import re
3+
def main():
4+
with open('input') as f:
5+
m = re.findall('mul\((\d+),(\d+)\)', f.read().strip())
6+
print(sum([int(mul[0]) * int(mul[1]) for mul in m]))
7+
8+
with open('input') as f:
9+
final = 0
10+
for enabled_section in f.read().split('do()'):
11+
# gung ho assumption: do() and don't() alternate cleanly
12+
enabled_section = enabled_section.split('don\'t()')[0]
13+
m = re.findall('mul\((\d+),(\d+)\)', enabled_section)
14+
final += sum([int(mul[0]) * int(mul[1]) for mul in m])
15+
print(final)
16+
17+
if __name__ == "__main__":
18+
main()

2024/day04/day04.py

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#!/usr/bin/python3
2+
3+
import re
4+
5+
# Override lists and strings so negative indices don't wrap around
6+
class gridlist(list):
7+
def __getitem__(self, n):
8+
if n < 0:
9+
raise IndexError("Negative index")
10+
return list.__getitem__(self, n)
11+
12+
class gridstring(str):
13+
def __getitem__(self, n):
14+
if n < 0:
15+
raise IndexError("Negative index")
16+
return str.__getitem__(self, n)
17+
18+
# Please don't read this code.
19+
def search(grid, m, y):
20+
matches = 0
21+
try:
22+
if grid[y - 1][m] == 'M':
23+
if grid[y - 2][m] == 'A':
24+
if grid[y - 3][m] == 'S':
25+
matches += 1
26+
except IndexError:
27+
pass
28+
try:
29+
if grid[y + 1][m] == 'M':
30+
if grid[y + 2][m] == 'A':
31+
if grid[y + 3][m] == 'S':
32+
matches += 1
33+
except IndexError:
34+
pass
35+
try:
36+
if grid[y - 1][m - 1] == 'M':
37+
if grid[y - 2][m - 2] == 'A':
38+
if grid[y - 3][m - 3] == 'S':
39+
matches += 1
40+
except IndexError:
41+
pass
42+
try:
43+
if grid[y + 1][m + 1] == 'M':
44+
if grid[y + 2][m + 2] == 'A':
45+
if grid[y + 3][m + 3] == 'S':
46+
matches += 1
47+
except IndexError:
48+
pass
49+
try:
50+
if grid[y - 1][m + 1] == 'M':
51+
if grid[y - 2][m + 2] == 'A':
52+
if grid[y - 3][m + 3] == 'S':
53+
matches += 1
54+
except IndexError:
55+
pass
56+
try:
57+
if grid[y + 1][m - 1] == 'M':
58+
if grid[y + 2][m - 2] == 'A':
59+
if grid[y + 3][m - 3] == 'S':
60+
matches += 1
61+
except IndexError:
62+
pass
63+
return matches
64+
65+
def check_slash(grid, m, y):
66+
try:
67+
if grid[y - 1][m + 1] == 'M':
68+
if grid[y + 1][m - 1] == 'S':
69+
return True
70+
else:
71+
pass
72+
else:
73+
pass
74+
except IndexError:
75+
return False
76+
try:
77+
if grid[y - 1][m + 1] == 'S':
78+
if grid[y + 1][m - 1] == 'M':
79+
return True
80+
else:
81+
pass
82+
else:
83+
pass
84+
except IndexError:
85+
return False
86+
return False
87+
88+
def check_backslash(grid, m, y):
89+
try:
90+
if grid[y - 1][m - 1] == 'M':
91+
if grid[y + 1][m + 1] == 'S':
92+
return True
93+
else:
94+
pass
95+
else:
96+
pass
97+
except IndexError:
98+
return False
99+
try:
100+
if grid[y - 1][m - 1] == 'S':
101+
if grid[y + 1][m + 1] == 'M':
102+
return True
103+
else:
104+
pass
105+
else:
106+
pass
107+
except IndexError:
108+
return False
109+
return False
110+
111+
def searchcross(grid, m, y):
112+
return check_slash(grid, m, y) and check_backslash(grid, m, y)
113+
114+
def main():
115+
with open('input') as f:
116+
grid = gridlist([gridstring(line.strip()) for line in f])
117+
118+
part1 = 0
119+
120+
for y in range(len(grid)):
121+
part1 += len([m for m in re.finditer('XMAS', grid[y])])
122+
part1 += len([m for m in re.finditer('SAMX', grid[y])])
123+
124+
x = [m.start() for m in re.finditer('X', grid[y])]
125+
126+
for m in x:
127+
part1 += search(grid, m, y)
128+
129+
print(part1)
130+
131+
part2 = 0
132+
133+
for y in range(len(grid)):
134+
x = [m.start() for m in re.finditer('A', grid[y])]
135+
136+
for m in x:
137+
part2 += searchcross(grid, m, y)
138+
139+
print(part2)
140+
141+
if __name__ == "__main__":
142+
main()

2024/day05/day05.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/python3
2+
from collections import defaultdict
3+
4+
class Rule(int):
5+
rulebook = defaultdict(set)
6+
7+
def __init__(self, num):
8+
self.num = int(num)
9+
10+
def __lt__(self, b):
11+
return b.num in self.rulebook[self.num]
12+
13+
def main():
14+
with open('input') as f:
15+
rules, updates = f.read().split('\n\n')
16+
17+
rules = [[int(page) for page in rule] for rule in [rule.split('|') for rule in rules.split()]]
18+
for r in rules:
19+
Rule.rulebook[r[0]].add(r[1])
20+
21+
updates = [[Rule(update) for update in updates] for updates in [update.split(',') for update in updates.split()]]
22+
23+
print(sum([update[(len(update) - 1)//2] for update in updates if update == sorted(update)]))
24+
print(sum([sorted(update)[(len(update) - 1)//2] for update in updates if update != sorted(update)]))
25+
26+
if __name__ == "__main__":
27+
main()

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Advent of Code
22

3-
![](https://img.shields.io/badge/2022%20⭐-6-yellow) ![](https://img.shields.io/badge/2021%20⭐-23-yellow) ![](https://img.shields.io/badge/2020%20⭐-16-yellow) ![](https://img.shields.io/badge/2019%20⭐-1-yellow) ![](https://img.shields.io/badge/2018%20⭐-41-yellow) ![](https://img.shields.io/badge/2017%20⭐-50-yellow) ![](https://img.shields.io/badge/2016%20⭐-42-yellow) ![](https://img.shields.io/badge/2015%20⭐-12-yellow)
3+
![](https://img.shields.io/badge/2024%20⭐-5-yellow) ![](https://img.shields.io/badge/2022%20⭐-6-yellow) ![](https://img.shields.io/badge/2021%20⭐-23-yellow) ![](https://img.shields.io/badge/2020%20⭐-16-yellow) ![](https://img.shields.io/badge/2019%20⭐-1-yellow) ![](https://img.shields.io/badge/2018%20⭐-41-yellow) ![](https://img.shields.io/badge/2017%20⭐-50-yellow) ![](https://img.shields.io/badge/2016%20⭐-42-yellow) ![](https://img.shields.io/badge/2015%20⭐-12-yellow)
44

55
[My](https://github.com/tobiasvl) solutions for the puzzles of [Advent of Code](http://adventofcode.com).
66

0 commit comments

Comments
 (0)
0