diff --git a/2015/d11.py b/2015/d11.py new file mode 100644 index 0000000..9638b55 --- /dev/null +++ b/2015/d11.py @@ -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) diff --git a/2015/d12.py b/2015/d12.py new file mode 100644 index 0000000..aa779df --- /dev/null +++ b/2015/d12.py @@ -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)) diff --git a/2015/d13.py b/2015/d13.py new file mode 100644 index 0000000..2af3640 --- /dev/null +++ b/2015/d13.py @@ -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) diff --git a/2015/d14.py b/2015/d14.py new file mode 100644 index 0000000..fa7b2ee --- /dev/null +++ b/2015/d14.py @@ -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)) + diff --git a/README.md b/README.md index adc7515..dec4643 100644 --- a/README.md +++ b/README.md @@ -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: