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 8: 14:55
|
||||||
- Day 9: 13:48
|
- Day 9: 13:48
|
||||||
- Day 10: 70:00 ... slow, but fun
|
- 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