Do days 5 and 6.

This commit is contained in:
felixm 2023-12-06 11:47:04 -05:00
parent 57e7fade4d
commit 0da8029686
5 changed files with 307 additions and 11 deletions

View File

@ -3,4 +3,7 @@
- Day 1: 40:00 (I don't know what I am doing.)
- Day 2: 14:15 (Okay, but far way from leaderboard.)
- Day 3: 1st 20:00, 2nd 70:00... (I had a logic error that took me a while to find.)
- Day 4:
- Day 4: 1st 9:06, 2nd 22:31; it wasn't hard but I didn't think quick enough :/
- Day 5: 1st 25:00, 2nd 1:55:00; Required patience and accuracy
- Day 6: 13:54; I was slow because I thought it is much harder?
- Day 7:

49
d4.py
View File

@ -1,36 +1,65 @@
from string import ascii_lowercase, ascii_uppercase, digits
import re
EXAMPLE = """
Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
"""
def clean(text: str) -> list[str]:
return list(filter(lambda l: l.strip() != "", text.splitlines()))
def solve(lines: list[str]):
s = 0
res = 0
for (i, line) in enumerate(lines):
print(i, line)
return s
c, s = line.split(":")
w, y = s.split("|")
w = set([int(c) for c in w.strip().split()])
y = set([int(c) for c in y.strip().split()])
z = w.intersection(y)
if z:
ps = 1
else:
ps = 0
for _ in range(len(z) - 1):
ps *= 2
res += ps
return res
def solve2(lines: list[str]):
s = 0
res = 0
matches = []
for (i, line) in enumerate(lines):
print(i, line)
return s
c, s = line.split(":")
w, y = s.split("|")
w = set([int(c) for c in w.strip().split()])
y = set([int(c) for c in y.strip().split()])
z = w.intersection(y)
matches.append(len(z))
scratchcards = list(range(len(matches)))
while scratchcards:
sc = scratchcards.pop()
res += 1
for i in range(matches[sc]):
if sc + i + 1 < len(matches):
scratchcards.append(sc + i + 1)
return res
def main():
example = clean(EXAMPLE)
print("Example 1:", solve(example))
return
data = clean(open("i4.txt").read())
print("Solution 1:", solve(data))
return
example = clean(EXAMPLE)
print("Example 2:", solve2(example))
return
data = clean(open("i4.txt").read())
print("Solution 2:", solve2(data))

163
d5.py Normal file
View File

@ -0,0 +1,163 @@
EXAMPLE = """
seeds: 79 14 55 13
seed-to-soil map:
50 98 2
52 50 48
soil-to-fertilizer map:
0 15 37
37 52 2
39 0 15
fertilizer-to-water map:
49 53 8
0 11 42
42 0 7
57 7 4
water-to-light map:
88 18 7
18 25 70
light-to-temperature map:
45 77 23
81 45 19
68 64 13
temperature-to-humidity map:
0 69 1
1 0 69
humidity-to-location map:
60 56 37
56 93 4
"""
def clean(text: str) -> list[str]:
return list(text.splitlines())
def solve(lines: list[str]):
seeds = []
idx = -1
maps = []
for (_, line) in enumerate(lines):
if line.startswith("seeds:"):
seeds = map(int, line.replace("seeds:", "").strip().split(" "))
continue
if line.strip() == "":
continue
if "map" in line:
maps.append([])
idx += 1
continue
else:
maps[idx].append(list(map(int, line.split(" "))))
locs = []
for current in seeds:
for m in maps:
for mapping in m:
dest_range_start, source_range_start, range_len = mapping
if current >= source_range_start and current < source_range_start + range_len:
current = dest_range_start + (current - source_range_start)
break
else:
current = current
locs.append(current)
return min(locs)
def solve2(lines: list[str]):
seeds = []
idx = -1
maps = []
for (_, line) in enumerate(lines):
if line.startswith("seeds:"):
all_seeds = []
seeds = list(map(int, line.replace("seeds:", "").strip().split(" ")))
for i in range(0, len(seeds), 2):
all_seeds.append(seeds[i:i+2])
seeds = all_seeds
continue
if line.strip() == "":
continue
if "map" in line:
maps.append([])
idx += 1
continue
else:
maps[idx].append(list(map(int, line.split(" "))))
# source: |---------------------|
# seeds:
# |---|
# aaaaaabbbb
# aaaaaabbbbbbbbbbbbbbbbbbbbbbcccc
# aaaaaaaaaaaaaaaa
# aaaaaaaaaaaaaaaaaaaccccc
# |-------|
for m in maps:
next_seeds = []
while seeds:
seed_start, seed_range = seeds.pop()
seed_end = seed_start + seed_range
for mapping in m:
dest_start, source_start, m_range = mapping
source_end = source_start + m_range
if seed_end <= source_start:
continue
elif seed_start < source_start and seed_end <= source_end:
a_range = source_start - seed_start
seeds.append([seed_start, a_range])
b_range = seed_end - source_start
next_seeds.append([dest_start, b_range])
break
elif seed_start < source_start and seed_end > source_end:
a_range = source_start - seed_start
seeds.append([seed_start, a_range])
next_seeds.append([dest_start, m_range]) # b range
c_range = seed_end - source_end
next_seeds.append([source_end, c_range])
break
elif seed_start >= source_start and seed_end <= source_end:
new_seed_start = dest_start + (seed_start - source_start)
next_seeds.append([new_seed_start, seed_range])
break
elif seed_start >= source_start and seed_start < source_end:
new_seed_start = dest_start + (seed_start - source_start)
a_range = source_end - seed_start
next_seeds.append([new_seed_start, a_range])
c_range = seed_end - source_end
seeds.append([source_end, c_range])
break
elif seed_start >= source_end:
continue
else:
print(f"{seed_start=} {seed_range=} {seed_end=}")
print(f"{source_start=} {source_end=}")
raise Exception("Unexpected case")
else:
next_seeds.append([seed_start, seed_range])
seeds = next_seeds
return min(seeds)[0]
def main():
example = clean(EXAMPLE)
print("Example 1:", solve(example))
data = clean(open("i5.txt").read())
print("Solution 1:", solve(data))
example = clean(EXAMPLE)
print("Example 2:", solve2(example))
data = clean(open("i5.txt").read())
print("Solution 2:", solve2(data))
assert(solve2(data) == 63179500)
if __name__ == "__main__":
main()

57
d6.py Normal file
View File

@ -0,0 +1,57 @@
EXAMPLE = """
Time: 7 15 30
Distance: 9 40 200
"""
def str_to_int_lst(s):
return list(map(int, s.split()))
def clean(text: str) -> list[str]:
return list(filter(lambda l: l.strip() != "", text.splitlines()))
def solve(lines: list[str]):
res = 1
t = []
for (_, line) in enumerate(lines):
numbers = str_to_int_lst(line.replace("Time:", "").replace("Distance:", "").strip())
t.append(numbers)
t = list(zip(*t))
for time, dist in t:
opt = 0
for press_time in range(1, time):
dist_trav = press_time * (time - press_time)
if dist_trav > dist:
opt += 1
res *= opt
return res
def solve2(lines: list[str]):
t = []
for (_, line) in enumerate(lines):
numbers = str_to_int_lst(line.replace("Time:", "").replace("Distance:", "").replace(" ", "").strip())
t.append(numbers[0])
time, dist = t
opt = 0
for press_time in range(1, time):
dist_trav = press_time * (time - press_time)
if dist_trav > dist:
opt += 1
return opt
def main():
example = clean(EXAMPLE)
print("Example 1:", solve(example))
data = clean(open("i6.txt").read())
print("Solution 1:", solve(data))
example = clean(EXAMPLE)
print("Example 2:", solve2(example))
data = clean(open("i6.txt").read())
print("Solution 2:", solve2(data))
return
if __name__ == "__main__":
main()

44
dx.py Normal file
View File

@ -0,0 +1,44 @@
from string import ascii_lowercase, ascii_uppercase, digits
import re
EXAMPLE = """
"""
def str_to_int_lst(s):
return list(map(int, s.split()))
def clean(text: str) -> list[str]:
return list(filter(lambda l: l.strip() != "", text.splitlines()))
# return list(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("i5.txt").read())
print("Solution 1:", solve(data))
return
example = clean(EXAMPLE)
print("Example 2:", solve2(example))
return
data = clean(open("i5.txt").read())
print("Solution 2:", solve2(data))
return
if __name__ == "__main__":
main()