Compare commits
2 Commits
9b9f777b1e
...
121f63f2d7
| Author | SHA1 | Date | |
|---|---|---|---|
| 121f63f2d7 | |||
| f8f963b973 |
146
src/Year_2021/P14.py
Normal file
146
src/Year_2021/P14.py
Normal file
@@ -0,0 +1,146 @@
|
||||
# --- Day 14: Extended Polymerization ---
|
||||
|
||||
# The incredible pressures at this depth are starting to put a strain on your
|
||||
# submarine. The submarine has polymerization equipment that would produce
|
||||
# suitable materials to reinforce the submarine, and the nearby
|
||||
# volcanically-active caves should even have the necessary input elements in
|
||||
# sufficient quantities.
|
||||
|
||||
# The submarine manual contains instructions for finding the optimal polymer
|
||||
# formula; specifically, it offers a polymer template and a list of pair
|
||||
# insertion rules (your puzzle input). You just need to work out what polymer
|
||||
# would result after repeating the pair insertion process a few times.
|
||||
|
||||
# For example:
|
||||
|
||||
# NNCB
|
||||
|
||||
# CH -> B
|
||||
# HH -> N
|
||||
# CB -> H
|
||||
# NH -> C
|
||||
# HB -> C
|
||||
# HC -> B
|
||||
# HN -> C
|
||||
# NN -> C
|
||||
# BH -> H
|
||||
# NC -> B
|
||||
# NB -> B
|
||||
# BN -> B
|
||||
# BB -> N
|
||||
# BC -> B
|
||||
# CC -> N
|
||||
# CN -> C
|
||||
|
||||
# The first line is the polymer template - this is the starting point of the
|
||||
# process.
|
||||
|
||||
# The following section defines the pair insertion rules. A rule like AB -> C
|
||||
# means that when elements A and B are immediately adjacent, element C should be
|
||||
# inserted between them. These insertions all happen simultaneously.
|
||||
|
||||
# So, starting with the polymer template NNCB, the first step simultaneously
|
||||
# considers all three pairs:
|
||||
|
||||
# The first pair (NN) matches the rule NN -> C, so element C is inserted
|
||||
# between the first N and the second N.
|
||||
# The second pair (NC) matches the rule NC -> B, so element B is inserted
|
||||
# between the N and the C.
|
||||
# The third pair (CB) matches the rule CB -> H, so element H is inserted
|
||||
# between the C and the B.
|
||||
|
||||
# Note that these pairs overlap: the second element of one pair is the first
|
||||
# element of the next pair. Also, because all pairs are considered
|
||||
# simultaneously, inserted elements are not considered to be part of a pair
|
||||
# until the next step.
|
||||
|
||||
# After the first step of this process, the polymer becomes NCNBCHB.
|
||||
|
||||
# Here are the results of a few steps using the above rules:
|
||||
|
||||
# Template: NNCB
|
||||
# After step 1: NCNBCHB
|
||||
# After step 2: NBCCNBBBCBHCB
|
||||
# After step 3: NBBBCNCCNBBNBNBBCHBHHBCHB
|
||||
# After step 4: NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB
|
||||
|
||||
# This polymer grows quickly. After step 5, it has length 97; After step 10, it
|
||||
# has length 3073. After step 10, B occurs 1749 times, C occurs 298 times, H
|
||||
# occurs 161 times, and N occurs 865 times; taking the quantity of the most
|
||||
# common element (B, 1749) and subtracting the quantity of the least common
|
||||
# element (H, 161) produces 1749 - 161 = 1588.
|
||||
|
||||
# Apply 10 steps of pair insertion to the polymer template and find the most and
|
||||
# least common elements in the result. What do you get if you take the quantity
|
||||
# of the most common element and subtract the quantity of the least common
|
||||
# element?
|
||||
|
||||
from collections import Counter
|
||||
|
||||
|
||||
def part_1() -> None:
|
||||
polymer, polymer_rules = open("files/P14.txt").read().split("\n\n")
|
||||
rules = {
|
||||
s: e
|
||||
for line in polymer_rules.strip().split("\n")
|
||||
for s, e in [line.strip().split(" -> ")]
|
||||
}
|
||||
|
||||
for _ in range(10):
|
||||
polymer = polymer[0] + "".join(
|
||||
rules[a + b] + b for a, b in zip(polymer, polymer[1:])
|
||||
)
|
||||
|
||||
most_common = Counter(polymer).most_common()
|
||||
print(f"The result is {most_common[0][1] - most_common[-1][1]}")
|
||||
|
||||
|
||||
# --- Part Two ---
|
||||
|
||||
# The resulting polymer isn't nearly strong enough to reinforce the submarine.
|
||||
# You'll need to run more steps of the pair insertion process; a total of 40
|
||||
# steps should do it.
|
||||
|
||||
# In the above example, the most common element is B (occurring 2192039569602
|
||||
# times) and the least common element is H (occurring 3849876073 times);
|
||||
# subtracting these produces 2188189693529.
|
||||
|
||||
# Apply 40 steps of pair insertion to the polymer template and find the most
|
||||
# and least common elements in the result. What do you get if you take the
|
||||
# quantity of the most common element and subtract the quantity of the least
|
||||
# common element?
|
||||
|
||||
from collections import defaultdict # noqa: E402
|
||||
|
||||
|
||||
def part_2() -> None:
|
||||
polymer, polymer_rules = open("files/P14.txt").read().split("\n\n")
|
||||
rules = {
|
||||
s: e
|
||||
for line in polymer_rules.strip().split("\n")
|
||||
for s, e in [line.strip().split(" -> ")]
|
||||
}
|
||||
counts = {key: polymer.count(key) for key in rules}
|
||||
|
||||
for _ in range(40):
|
||||
new_counts = defaultdict(int)
|
||||
|
||||
for pair, count in counts.items():
|
||||
char = rules[pair]
|
||||
new_counts[pair[0] + char] += count
|
||||
new_counts[char + pair[1]] += count
|
||||
|
||||
counts = new_counts
|
||||
|
||||
element_counts = defaultdict(int, {polymer[0]: 1})
|
||||
|
||||
for pair, count in counts.items():
|
||||
element_counts[pair[1]] += count
|
||||
|
||||
most_common = Counter(element_counts).most_common()
|
||||
print(f"The result is {most_common[0][1] - most_common[-1][1]}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
part_1()
|
||||
part_2()
|
||||
102
src/Year_2021/files/P14.txt
Normal file
102
src/Year_2021/files/P14.txt
Normal file
@@ -0,0 +1,102 @@
|
||||
PSVVKKCNBPNBBHNSFKBO
|
||||
|
||||
CF -> H
|
||||
PP -> H
|
||||
SP -> V
|
||||
NO -> C
|
||||
SF -> F
|
||||
FS -> H
|
||||
OF -> P
|
||||
PN -> B
|
||||
SH -> V
|
||||
BO -> K
|
||||
ON -> V
|
||||
VP -> S
|
||||
HN -> B
|
||||
PS -> P
|
||||
FV -> H
|
||||
NC -> N
|
||||
FN -> S
|
||||
PF -> F
|
||||
BF -> F
|
||||
NB -> O
|
||||
HS -> C
|
||||
SC -> V
|
||||
PC -> K
|
||||
KF -> K
|
||||
HC -> C
|
||||
OK -> H
|
||||
KS -> P
|
||||
VF -> C
|
||||
NV -> S
|
||||
KK -> F
|
||||
HV -> H
|
||||
SV -> V
|
||||
KC -> N
|
||||
HF -> P
|
||||
SN -> F
|
||||
VS -> P
|
||||
VN -> F
|
||||
VH -> C
|
||||
OB -> K
|
||||
VV -> O
|
||||
VC -> O
|
||||
KP -> V
|
||||
OP -> C
|
||||
HO -> S
|
||||
NP -> K
|
||||
HB -> C
|
||||
CS -> S
|
||||
OO -> S
|
||||
CV -> K
|
||||
BS -> F
|
||||
BH -> P
|
||||
HP -> P
|
||||
PK -> B
|
||||
BB -> H
|
||||
PV -> N
|
||||
VO -> P
|
||||
SS -> B
|
||||
CC -> F
|
||||
BC -> V
|
||||
FF -> S
|
||||
HK -> V
|
||||
OH -> N
|
||||
BV -> C
|
||||
CP -> F
|
||||
KN -> K
|
||||
NN -> S
|
||||
FB -> F
|
||||
PH -> O
|
||||
FH -> N
|
||||
FK -> P
|
||||
CK -> V
|
||||
CN -> S
|
||||
BP -> K
|
||||
CH -> F
|
||||
FP -> K
|
||||
HH -> N
|
||||
NF -> C
|
||||
VB -> B
|
||||
FO -> N
|
||||
PB -> C
|
||||
KH -> K
|
||||
PO -> K
|
||||
OV -> F
|
||||
NH -> H
|
||||
KV -> B
|
||||
OS -> K
|
||||
OC -> K
|
||||
FC -> H
|
||||
SO -> H
|
||||
KO -> P
|
||||
NS -> F
|
||||
CB -> C
|
||||
CO -> F
|
||||
KB -> V
|
||||
BK -> K
|
||||
NK -> O
|
||||
SK -> C
|
||||
SB -> B
|
||||
VK -> O
|
||||
BN -> H
|
||||
Reference in New Issue
Block a user