Solve 2015 days 11-14.
This commit is contained in:
49
2015/d11.py
Normal file
49
2015/d11.py
Normal 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
27
2015/d12.py
Normal 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
35
2015/d13.py
Normal 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
53
2015/d14.py
Normal 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))
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user