Skip to content

Instantly share code, notes, and snippets.

@DecemberDream
Created December 14, 2021 15:58

Revisions

  1. DecemberDream created this gist Dec 14, 2021.
    54 changes: 54 additions & 0 deletions aoc_2021_day_14_part_2.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,54 @@
    import collections
    import numpy as np


    template, insertions = open("../../input/day_14_example.txt").read().split("\n\n")
    insertions = insertions.split("\n")
    rules = {}
    rules_idx = {}

    for i, insertion in enumerate(insertions):
    split_insertion = insertion.rstrip().split(" -> ")
    rules[split_insertion[0]] = split_insertion[1]
    rules_idx[split_insertion[0]] = i

    n = len(rules)
    x = np.zeros(n)
    A = np.zeros((n, n))

    bigrams = [template[i:i+2] for i in range(len(template) - 1)]

    for bigram in bigrams:
    x[rules_idx[bigram]] += 1

    for rule in rules_idx:
    r = list(rule)
    r.insert(1, rules[rule])

    trigram = "".join(c for c in r)

    b1 = trigram[:2]
    b2 = trigram[1:]

    col_1 = rules_idx[b1]
    col_2 = rules_idx[b2]
    A[rules_idx[rule], col_1] = 1
    A[rules_idx[rule], col_2] = 1

    b = np.dot(x, np.linalg.matrix_power(A, 10))
    res = template[0] + template[-1]

    keys = list(rules_idx.keys())
    # vals = list(rules_idx.values())
    for i in range(n):
    res += int(b[i]) * keys[i]

    #res += template[-1]
    char_count = collections.Counter(res).most_common()

    most_common = char_count[0]
    least_common = char_count[-1]

    print(most_common)
    print(least_common)
    print("difference", most_common[1] - least_common[1])