Days 7, 8, 9. 9 was fun.
This commit is contained in:
@@ -6,4 +6,7 @@
|
|||||||
- Day 4: 7:08 but top 100 required 3:33 still okay
|
- Day 4: 7:08 but top 100 required 3:33 still okay
|
||||||
- Day 5: 11:56 but 7:58 for top 100... getting better?
|
- Day 5: 11:56 but 7:58 for top 100... getting better?
|
||||||
- Day 6: 3:50 but 2:25 for leaderboard :D
|
- Day 6: 3:50 but 2:25 for leaderboard :D
|
||||||
- Day 7:
|
- Day 7: 27:55 and 14:47 for leaderboard; okay, I would say
|
||||||
|
- Day 8: 61:00 and 10:00 for leaderboard; I need template code for searching coordinate systems
|
||||||
|
- Day 9: 58:00 and 7:32 for leaderboard; I need code for 2D stuff
|
||||||
|
- Day 10:
|
||||||
|
|||||||
117
d7.py
Normal file
117
d7.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
import re
|
||||||
|
from string import ascii_lowercase, ascii_uppercase, digits
|
||||||
|
|
||||||
|
EXAMPLE = """
|
||||||
|
$ cd /
|
||||||
|
$ ls
|
||||||
|
dir a
|
||||||
|
14848514 b.txt
|
||||||
|
8504156 c.dat
|
||||||
|
dir d
|
||||||
|
$ cd a
|
||||||
|
$ ls
|
||||||
|
dir e
|
||||||
|
29116 f
|
||||||
|
2557 g
|
||||||
|
62596 h.lst
|
||||||
|
$ cd e
|
||||||
|
$ ls
|
||||||
|
584 i
|
||||||
|
$ cd ..
|
||||||
|
$ cd ..
|
||||||
|
$ cd d
|
||||||
|
$ ls
|
||||||
|
4060174 j
|
||||||
|
8033020 d.log
|
||||||
|
5626152 d.ext
|
||||||
|
7214296 k
|
||||||
|
"""
|
||||||
|
|
||||||
|
def clean(text: str) -> list[str]:
|
||||||
|
return list(filter(lambda l: l.strip() != "", text.splitlines()))
|
||||||
|
|
||||||
|
def solve(lines: list[str]):
|
||||||
|
sizes = {}
|
||||||
|
res = 0
|
||||||
|
|
||||||
|
current_dir = ()
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith("$ cd"):
|
||||||
|
c = line.replace("$ cd ", "").strip()
|
||||||
|
if c == "..":
|
||||||
|
current_dir = tuple(list(current_dir)[:-1])
|
||||||
|
else:
|
||||||
|
current_dir = tuple(list(current_dir) + [c])
|
||||||
|
elif line[0] in digits:
|
||||||
|
size, _ = line.split()
|
||||||
|
size = int(size)
|
||||||
|
try:
|
||||||
|
sizes[current_dir] += size
|
||||||
|
except KeyError:
|
||||||
|
sizes[current_dir] = size
|
||||||
|
|
||||||
|
for i in range(1, len(current_dir)):
|
||||||
|
outer_dir = tuple(list(current_dir)[:-i])
|
||||||
|
try:
|
||||||
|
sizes[outer_dir] += size
|
||||||
|
except KeyError:
|
||||||
|
sizes[outer_dir] = size
|
||||||
|
|
||||||
|
for _, size in sizes.items():
|
||||||
|
if size <= 100000:
|
||||||
|
res += size
|
||||||
|
# 23:50
|
||||||
|
return res
|
||||||
|
|
||||||
|
def solve2(lines: list[str]):
|
||||||
|
sizes = {}
|
||||||
|
res = 0
|
||||||
|
|
||||||
|
current_dir = ()
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith("$ cd"):
|
||||||
|
c = line.replace("$ cd ", "").strip()
|
||||||
|
if c == "..":
|
||||||
|
current_dir = tuple(list(current_dir)[:-1])
|
||||||
|
else:
|
||||||
|
current_dir = tuple(list(current_dir) + [c])
|
||||||
|
elif line[0] in digits:
|
||||||
|
size, _ = line.split()
|
||||||
|
size = int(size)
|
||||||
|
try:
|
||||||
|
sizes[current_dir] += size
|
||||||
|
except KeyError:
|
||||||
|
sizes[current_dir] = size
|
||||||
|
|
||||||
|
for i in range(1, len(current_dir)):
|
||||||
|
outer_dir = tuple(list(current_dir)[:-i])
|
||||||
|
try:
|
||||||
|
sizes[outer_dir] += size
|
||||||
|
except KeyError:
|
||||||
|
sizes[outer_dir] = size
|
||||||
|
total_space = 70000000
|
||||||
|
unused_space = 30000000
|
||||||
|
used_space = sizes[("/",)]
|
||||||
|
|
||||||
|
res = 2**32
|
||||||
|
for _, size in sizes.items():
|
||||||
|
if total_space - used_space + size >= unused_space and size < res:
|
||||||
|
res = size
|
||||||
|
# 27:55
|
||||||
|
return res
|
||||||
|
|
||||||
|
def main():
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 1:", solve(example))
|
||||||
|
|
||||||
|
data = clean(open("i7.txt").read())
|
||||||
|
print("Solution 1:", solve(data))
|
||||||
|
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 2:", solve2(example))
|
||||||
|
|
||||||
|
data = clean(open("i7.txt").read())
|
||||||
|
print("Solution 2:", solve2(data))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
132
d8.py
Normal file
132
d8.py
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
import re
|
||||||
|
from string import ascii_lowercase, ascii_uppercase
|
||||||
|
|
||||||
|
EXAMPLE = """
|
||||||
|
30373
|
||||||
|
25512
|
||||||
|
65332
|
||||||
|
33549
|
||||||
|
35390
|
||||||
|
"""
|
||||||
|
|
||||||
|
def clean(text: str) -> list[str]:
|
||||||
|
return list(filter(lambda l: l.strip() != "", text.splitlines()))
|
||||||
|
|
||||||
|
|
||||||
|
def is_visible(trees, y_tree, x_tree):
|
||||||
|
y_max = len(trees)
|
||||||
|
x_max = len(trees[0])
|
||||||
|
tree_height = trees[y_tree][x_tree]
|
||||||
|
|
||||||
|
for x in range(0, x_tree):
|
||||||
|
if trees[y_tree][x] >= tree_height:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
for x in range(x_tree + 1, x_max):
|
||||||
|
if trees[y_tree][x] >= tree_height:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
for y in range(0, y_tree):
|
||||||
|
if trees[y][x_tree] >= tree_height:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
for y in range(y_tree + 1, y_max):
|
||||||
|
if trees[y][x_tree] >= tree_height:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def solve(lines: list[str]):
|
||||||
|
res = 0
|
||||||
|
trees = []
|
||||||
|
for i in range(len(lines)):
|
||||||
|
line = lines[i]
|
||||||
|
trees.append(list(map(int, line)))
|
||||||
|
|
||||||
|
for y in range(len(trees)):
|
||||||
|
for x in range(len(trees)):
|
||||||
|
if is_visible(trees, y, x):
|
||||||
|
res += 1
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def scenic_score(trees, y_tree, x_tree):
|
||||||
|
y_max = len(trees)
|
||||||
|
x_max = len(trees[0])
|
||||||
|
|
||||||
|
if x_tree == 0 or y_tree == 0 or x_tree == x_max - 1 or y_tree == y_max - 1:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
tree_height = trees[y_tree][x_tree]
|
||||||
|
left, right, up, down = 0, 0, 0, 0
|
||||||
|
|
||||||
|
for x in range(x_tree - 1, -1, -1):
|
||||||
|
if trees[y_tree][x] < tree_height:
|
||||||
|
left += 1
|
||||||
|
else:
|
||||||
|
left += 1
|
||||||
|
break
|
||||||
|
|
||||||
|
for x in range(x_tree + 1, x_max):
|
||||||
|
if trees[y_tree][x] < tree_height:
|
||||||
|
right += 1
|
||||||
|
else:
|
||||||
|
right += 1
|
||||||
|
break
|
||||||
|
|
||||||
|
for y in range(y_tree - 1, -1, -1):
|
||||||
|
if trees[y][x_tree] < tree_height:
|
||||||
|
up += 1
|
||||||
|
else:
|
||||||
|
up += 1
|
||||||
|
break
|
||||||
|
|
||||||
|
for y in range(y_tree + 1, y_max):
|
||||||
|
if trees[y][x_tree] < tree_height:
|
||||||
|
down += 1
|
||||||
|
else:
|
||||||
|
down += 1
|
||||||
|
break
|
||||||
|
|
||||||
|
score = up * down * left * right
|
||||||
|
# print(f"{y_tree=} {x_tree=} {left=} {right=} {up=} {down=} {score=}")
|
||||||
|
return score
|
||||||
|
|
||||||
|
def solve2(lines: list[str]):
|
||||||
|
trees = []
|
||||||
|
for i in range(len(lines)):
|
||||||
|
line = lines[i]
|
||||||
|
trees.append(list(map(int, line)))
|
||||||
|
|
||||||
|
max_score = 0
|
||||||
|
for y in range(len(trees)):
|
||||||
|
for x in range(len(trees)):
|
||||||
|
score = scenic_score(trees, y, x)
|
||||||
|
if score > max_score:
|
||||||
|
max_score = score
|
||||||
|
return max_score
|
||||||
|
|
||||||
|
def main():
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 1:", solve(example))
|
||||||
|
|
||||||
|
data = clean(open("i8.txt").read())
|
||||||
|
print("Solution 1:", solve(data))
|
||||||
|
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 2:", solve2(example))
|
||||||
|
|
||||||
|
data = clean(open("i8.txt").read())
|
||||||
|
print("Solution 2:", solve2(data))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
128
d9.py
Normal file
128
d9.py
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
EXAMPLE = """
|
||||||
|
R 4
|
||||||
|
U 4
|
||||||
|
L 3
|
||||||
|
D 1
|
||||||
|
R 4
|
||||||
|
D 1
|
||||||
|
L 5
|
||||||
|
R 2
|
||||||
|
"""
|
||||||
|
|
||||||
|
def clean(text: str) -> list[str]:
|
||||||
|
return list(filter(lambda l: l.strip() != "", text.splitlines()))
|
||||||
|
|
||||||
|
def new_pos(h_pos, t_pos, dir):
|
||||||
|
if dir == "R":
|
||||||
|
new_h_pos = (h_pos[0] + 1, h_pos[1])
|
||||||
|
elif dir == "U":
|
||||||
|
new_h_pos = (h_pos[0], h_pos[1] + 1)
|
||||||
|
elif dir == "L":
|
||||||
|
new_h_pos = (h_pos[0] - 1, h_pos[1])
|
||||||
|
elif dir == "D":
|
||||||
|
new_h_pos = (h_pos[0], h_pos[1] - 1)
|
||||||
|
elif dir == "NONE":
|
||||||
|
new_h_pos = (h_pos[0], h_pos[1])
|
||||||
|
else:
|
||||||
|
raise Exception("Unexpected direction.")
|
||||||
|
|
||||||
|
# xxxxx
|
||||||
|
# x---x
|
||||||
|
# x-O-x
|
||||||
|
# x---x
|
||||||
|
# xxxxx
|
||||||
|
dx, dy = t_pos[0] - new_h_pos[0], t_pos[1] - new_h_pos[1]
|
||||||
|
delta = {
|
||||||
|
(-1, -1): (0, 0),
|
||||||
|
(-1, 0): (0, 0),
|
||||||
|
(-1, 1): (0, 0),
|
||||||
|
(0, -1): (0, 0),
|
||||||
|
(0, 0): (0, 0),
|
||||||
|
(0, 1): (0, 0),
|
||||||
|
(1, -1): (0, 0),
|
||||||
|
(1, 0): (0, 0),
|
||||||
|
(1, 1): (0, 0),
|
||||||
|
(-2, 2): (1, -1),
|
||||||
|
(-2, 1): (1, -1),
|
||||||
|
(-2, 0): (1, 0),
|
||||||
|
(-2, -1): (1, 1),
|
||||||
|
(-2, -2): (1, 1),
|
||||||
|
(2, 2): (-1, -1),
|
||||||
|
(2, 1): (-1, -1),
|
||||||
|
(2, 0): (-1, 0),
|
||||||
|
(2, -1): (-1, 1),
|
||||||
|
(2, -2): (-1, 1),
|
||||||
|
(-1, 2): (1, -1),
|
||||||
|
(-1, -2): (1, 1),
|
||||||
|
(0, 2): (0, -1),
|
||||||
|
(0, -2): (0, 1),
|
||||||
|
(1, 2): (-1, -1),
|
||||||
|
(1, -2): (-1, 1),
|
||||||
|
}
|
||||||
|
dx_, dy_ = delta[(dx, dy)]
|
||||||
|
new_t_pos = t_pos[0] + dx_, t_pos[1] + dy_
|
||||||
|
# print(f"{h_pos=} {t_pos=} {dir=}")
|
||||||
|
# print(f"{new_h_pos=} {dx=} {dy=}")
|
||||||
|
# print(f"{new_t_pos=}")
|
||||||
|
# print("----")
|
||||||
|
return new_t_pos, new_h_pos
|
||||||
|
|
||||||
|
def solve(lines: list[str]):
|
||||||
|
pos = set()
|
||||||
|
h_pos = (0, 0)
|
||||||
|
t_pos = (0, 0)
|
||||||
|
pos.add(t_pos)
|
||||||
|
for i in range(len(lines)):
|
||||||
|
dir, amount = lines[i].split()
|
||||||
|
for _ in range(int(amount)):
|
||||||
|
t_pos, h_pos = new_pos(h_pos, t_pos, dir)
|
||||||
|
pos.add(t_pos)
|
||||||
|
# 44:00
|
||||||
|
return len(pos)
|
||||||
|
|
||||||
|
EXAMPLE2 = """
|
||||||
|
R 5
|
||||||
|
U 8
|
||||||
|
L 8
|
||||||
|
D 3
|
||||||
|
R 17
|
||||||
|
D 10
|
||||||
|
L 25
|
||||||
|
U 20
|
||||||
|
"""
|
||||||
|
|
||||||
|
def solve2(lines: list[str]):
|
||||||
|
vis = set()
|
||||||
|
poss = [(0, 0) for _ in range(10)]
|
||||||
|
vis.add((0, 0))
|
||||||
|
for i in range(len(lines)):
|
||||||
|
dir, amount = lines[i].split()
|
||||||
|
for _ in range(int(amount)):
|
||||||
|
for i in range(len(poss) - 1):
|
||||||
|
h_pos = poss[i]
|
||||||
|
t_pos = poss[i + 1]
|
||||||
|
if i == 0:
|
||||||
|
t_pos, h_pos = new_pos(h_pos, t_pos, dir)
|
||||||
|
else:
|
||||||
|
t_pos, h_pos = new_pos(h_pos, t_pos, "NONE")
|
||||||
|
poss[i] = h_pos
|
||||||
|
poss[i + 1] = t_pos
|
||||||
|
vis.add(poss[-1])
|
||||||
|
# 58:00
|
||||||
|
return len(vis)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 1:", solve(example))
|
||||||
|
|
||||||
|
data = clean(open("i9.txt").read())
|
||||||
|
print("Solution 1:", solve(data))
|
||||||
|
|
||||||
|
example = clean(EXAMPLE2)
|
||||||
|
print("Example 2:", solve2(example))
|
||||||
|
|
||||||
|
data = clean(open("i9.txt").read())
|
||||||
|
print("Solution 2:", solve2(data))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
39
dx.py
Normal file
39
dx.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import re
|
||||||
|
from string import ascii_lowercase, ascii_uppercase
|
||||||
|
|
||||||
|
EXAMPLE = """
|
||||||
|
"""
|
||||||
|
|
||||||
|
def clean(text: str) -> list[str]:
|
||||||
|
return list(filter(lambda l: l.strip() != "", text.splitlines()))
|
||||||
|
|
||||||
|
def solve(lines: list[str]):
|
||||||
|
res = 0
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
print(i, line)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def solve2(lines: list[str]):
|
||||||
|
res = 0
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
print(i, line)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def main():
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 1:", solve(example))
|
||||||
|
return
|
||||||
|
|
||||||
|
data = clean(open("i6.txt").read())
|
||||||
|
print("Solution 1:", solve(data))
|
||||||
|
return
|
||||||
|
|
||||||
|
example = clean(EXAMPLE)
|
||||||
|
print("Example 2:", solve2(example))
|
||||||
|
return
|
||||||
|
|
||||||
|
data = clean(open("i6.txt").read())
|
||||||
|
print("Solution 2:", solve2(data))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user