Solve 2015 days 11-14.

This commit is contained in:
2024-01-31 21:20:45 -05:00
parent 0dfb4f974a
commit 35a01f1f65
5 changed files with 169 additions and 1 deletions

49
2015/d11.py Normal file
View File

@@ -0,0 +1,49 @@
data = open(0).read().strip()
def is_valid(pw):
# Passwords must include one increasing straight of at least three letters,
# like abc, bcd, cde, and so on, up to xyz. They cannot skip letters; abd
# doesn't count.
ords = list(map(ord, pw))
for i in range(len(ords) - 2):
if ords[i] + 1 == ords[i + 1] and ords[i + 1] + 1 == ords[i + 2]:
break
else:
return False
# Passwords may not contain the letters i, o, or l, as these letters can be
# mistaken for other characters and are therefore confusing.
for c in "iol":
if c in pw:
return False
# Passwords must contain at least two different, non-overlapping pairs of letters, like aa, bb, or zz
pairs = set()
for i in range(len(pw) - 1):
if pw[i] == pw[i + 1]:
pairs.add(pw[i])
if not len(pairs) >= 2:
return False
return True
def inc(pw):
pw = list(map(ord, pw))
for i in range(len(pw) - 1, -1, -1):
pw[i] += 1
if pw[i] == ord('z') + 1:
pw[i] = ord('a')
else:
break
return "".join(map(chr, pw))
part_1 = False
valid_count = 0
while True:
data = inc(data)
if is_valid(data):
valid_count += 1
if part_1 and valid_count == 1:
break
elif valid_count == 2:
break
print(data)

27
2015/d12.py Normal file
View File

@@ -0,0 +1,27 @@
import json
data = open(0).read().strip()
part_2 = False
def addup(d):
r = 0
if isinstance(d, list):
for e in d:
v = addup(e)
if v is not None:
r += v
elif isinstance(d, dict):
for e in d.values():
v = addup(e)
if v is None:
return 0
r += v
elif isinstance(d, str):
if part_2 and d == "red":
return None
else:
r += d
return r
data = json.loads(data)
print(addup(data))

35
2015/d13.py Normal file
View File

@@ -0,0 +1,35 @@
from itertools import permutations
data = open(0).read().strip()
part_2 = False
people = set()
scores = {}
for line in data.splitlines():
a, _, wl, score, _, _, _, _, _, _, b = line.split()
b = b.replace(".", "")
score = int(score)
if wl == "lose":
score = -score
people.add(a)
people.add(b)
scores[(a, b)] = score
if part_2:
scores[(a, "me")] = 0
scores[("me", a)] = 0
scores[(b, "me")] = 0
scores[("me", b)] = 0
if part_2:
people.add("me")
max_score = 0
for p in permutations(list(people)):
s = 0
for i in range(len(p)):
a, b = p[i], p[(i + 1) % len(p)]
s += scores[(a, b)]
s += scores[(b, a)]
max_score = max(max_score, s)
print(max_score)

53
2015/d14.py Normal file
View File

@@ -0,0 +1,53 @@
import lib
data = open(0).read().strip()
part_1 = False
rds = []
max_dist = 0
gtime = 2503
rds = []
for line in data.splitlines():
speed, time, rest = lib.str_to_ints(line)
rds.append([speed, time, rest, 0, 0, 0])
speed *= 1000
dist = 0
ctime = 0
while ctime < gtime:
t = min(time, gtime - ctime)
dist += (speed * t)
ctime += time
ctime += rest
max_dist = max(dist, max_dist)
if part_1:
print(max_dist // 1000)
scores = [0 for _ in range(len(rds))]
for _ in range(gtime):
for i in range(len(rds)):
speed, time, rest, dist, travel_time, rest_time = rds[i]
rd = rds[i]
if travel_time < time:
rd[3] += speed
rd[4] += 1
elif rest_time < rest:
rd[5] += 1
if rd[5] == rest:
rd[4] = 0
rd[5] = 0
max_i = -1
max_v = 0
for i, rd in enumerate(rds):
if rd[3] > max_v:
max_i = i
max_v = rd[3]
for i, rd in enumerate(rds):
if rd[3] == max_v:
scores[i] += 1
if not part_1:
print(max(scores))

View File

@@ -15,4 +15,8 @@ written in Python.
- Day 8: 14:55
- Day 9: 13:48
- Day 10: 70:00 ... slow, but fun
- Day 11:
- Day 11: 12:30
- Day 12: 6:03
- Day 13: 7:06 (would have been first by a minute, probably 70ish in 2023)
- Day 14: 27:45 ... that was weak, logic error for part 2 :/
- Day 15: