[py] Port 2021_14

This commit is contained in:
Joscha 2022-12-04 14:34:09 +01:00
parent 1dc77551b3
commit 81945a973d
4 changed files with 12 additions and 17 deletions

View file

@ -2,9 +2,11 @@ import sys
import argparse import argparse
from pathlib import Path from pathlib import Path
from .y2021 import d14
from .y2022 import d01, d02, d03, d04 from .y2022 import d01, d02, d03, d04
DAYS = { DAYS = {
"2021_14": y2021.d14.solve,
"2022_01": y2022.d01.solve, "2022_01": y2022.d01.solve,
"2022_02": y2022.d02.solve, "2022_02": y2022.d02.solve,
"2022_03": y2022.d03.solve, "2022_03": y2022.d03.solve,

View file

@ -1,7 +1,7 @@
import argparse
from pathlib import Path from pathlib import Path
from collections import Counter from collections import Counter
def step(pairs, rules): def step(pairs, rules):
result = Counter() result = Counter()
for pair, amount in pairs.items(): for pair, amount in pairs.items():
@ -13,6 +13,7 @@ def step(pairs, rules):
result[pair] += amount result[pair] += amount
return result return result
def count_chars(template, pairs): def count_chars(template, pairs):
chars = Counter() chars = Counter()
for pair, amount in pairs.items(): for pair, amount in pairs.items():
@ -20,20 +21,15 @@ def count_chars(template, pairs):
chars[template[-1]] += 1 chars[template[-1]] += 1
return chars return chars
def main():
parser = argparse.ArgumentParser()
parser.add_argument("file", type=Path)
args = parser.parse_args()
with open(args.file) as f: def solve(inputstr):
template = next(f).strip() template, rest = inputstr.split("\n\n", maxsplit=1)
next(f) rules = {}
rules = {} for line in rest.splitlines():
for line in f: pair, char = line.split(" -> ")
pair, char = line.strip().split(" -> ") rules[pair] = (pair[0] + char, char + pair[1])
rules[pair] = (pair[0] + char, char + pair[1])
pairs = Counter(template[i:i+2] for i in range(len(template) - 1)) pairs = Counter(template[i : i + 2] for i in range(len(template) - 1))
for i in range(10): for i in range(10):
pairs = step(pairs, rules) pairs = step(pairs, rules)
@ -41,11 +37,8 @@ def main():
chars = count_chars(template, pairs).most_common() chars = count_chars(template, pairs).most_common()
print(f"Part 1: {chars[0][1] - chars[-1][1]}") print(f"Part 1: {chars[0][1] - chars[-1][1]}")
for i in range(30): # 40 steps total for i in range(30): # 40 steps total
pairs = step(pairs, rules) pairs = step(pairs, rules)
chars = count_chars(template, pairs).most_common() chars = count_chars(template, pairs).most_common()
print(f"Part 2: {chars[0][1] - chars[-1][1]}") print(f"Part 2: {chars[0][1] - chars[-1][1]}")
if __name__ == "__main__":
main()