Compare commits
4 commits
b1f325432c
...
2d75eea1a8
Author | SHA1 | Date | |
---|---|---|---|
Bruno BELANYI | 2d75eea1a8 | ||
Bruno BELANYI | 420d4a8f7a | ||
Bruno BELANYI | a1520e437e | ||
Bruno BELANYI | 235f8cd29b |
57
2021/d14/ex1/ex1.py
Executable file
57
2021/d14/ex1/ex1.py
Executable file
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import itertools
|
||||
import sys
|
||||
from collections import Counter
|
||||
from typing import Dict, Iterator, List, Tuple, TypeVar
|
||||
|
||||
Rules = Dict[str, str]
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
def nth(iterable: Iterator[T], n: int) -> T:
|
||||
return next(itertools.islice(iterable, n, None))
|
||||
|
||||
|
||||
def solve(input: List[str]) -> int:
|
||||
def parse() -> Tuple[str, Rules]:
|
||||
template = input[0]
|
||||
rules = {
|
||||
pair: insertion
|
||||
for pair, insertion in map(lambda s: s.split(" -> "), input[2:])
|
||||
}
|
||||
return template, rules
|
||||
|
||||
def step(template: str, rules: Rules) -> str:
|
||||
res: List[str] = []
|
||||
|
||||
# Look at all pairs
|
||||
for a, b in zip(template, template[1:]):
|
||||
res.append(a)
|
||||
if (a + b) in rules:
|
||||
res.append(rules[a + b])
|
||||
|
||||
# Add the last element
|
||||
res.append(template[-1])
|
||||
return "".join(res)
|
||||
|
||||
def polymerize(template: str, rules: Rules) -> Iterator[str]:
|
||||
while True:
|
||||
yield (template := step(template, rules))
|
||||
|
||||
def score(template: str) -> int:
|
||||
counts = [n for __, n in Counter(template).most_common()]
|
||||
return counts[0] - counts[-1]
|
||||
|
||||
template, rules = parse()
|
||||
return score(nth(polymerize(template, rules), 10 - 1))
|
||||
|
||||
|
||||
def main() -> None:
|
||||
input = [line.strip() for line in sys.stdin.readlines()]
|
||||
print(solve(input))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
102
2021/d14/ex1/input
Normal file
102
2021/d14/ex1/input
Normal file
|
@ -0,0 +1,102 @@
|
|||
NNSOFOCNHBVVNOBSBHCB
|
||||
|
||||
HN -> S
|
||||
FK -> N
|
||||
CH -> P
|
||||
VP -> P
|
||||
VV -> C
|
||||
PB -> H
|
||||
CP -> F
|
||||
KO -> P
|
||||
KN -> V
|
||||
NO -> K
|
||||
NF -> N
|
||||
CO -> P
|
||||
HO -> H
|
||||
VH -> V
|
||||
OV -> C
|
||||
VS -> F
|
||||
PK -> H
|
||||
OS -> S
|
||||
BF -> S
|
||||
SN -> P
|
||||
NK -> N
|
||||
SV -> O
|
||||
KB -> O
|
||||
ON -> O
|
||||
FN -> H
|
||||
FO -> N
|
||||
KV -> S
|
||||
CS -> C
|
||||
VO -> O
|
||||
SP -> O
|
||||
VK -> H
|
||||
KP -> S
|
||||
SK -> N
|
||||
NC -> B
|
||||
PN -> N
|
||||
HV -> O
|
||||
HS -> C
|
||||
CN -> N
|
||||
OO -> V
|
||||
FF -> B
|
||||
VC -> V
|
||||
HK -> K
|
||||
CC -> H
|
||||
BO -> H
|
||||
SC -> O
|
||||
HH -> C
|
||||
BV -> P
|
||||
OB -> O
|
||||
FC -> H
|
||||
PO -> C
|
||||
FV -> C
|
||||
BK -> F
|
||||
HB -> B
|
||||
NH -> P
|
||||
KF -> N
|
||||
BP -> H
|
||||
KK -> O
|
||||
OH -> K
|
||||
CB -> H
|
||||
CK -> C
|
||||
OK -> H
|
||||
NN -> F
|
||||
VF -> N
|
||||
SO -> K
|
||||
OP -> F
|
||||
NP -> B
|
||||
FS -> S
|
||||
SH -> O
|
||||
FP -> O
|
||||
SF -> V
|
||||
HF -> N
|
||||
KC -> K
|
||||
SB -> V
|
||||
FH -> N
|
||||
SS -> C
|
||||
BB -> C
|
||||
NV -> K
|
||||
OC -> S
|
||||
CV -> N
|
||||
HC -> P
|
||||
BC -> N
|
||||
OF -> K
|
||||
BH -> N
|
||||
NS -> K
|
||||
BN -> F
|
||||
PC -> C
|
||||
CF -> N
|
||||
HP -> F
|
||||
BS -> O
|
||||
PF -> S
|
||||
PV -> B
|
||||
KH -> K
|
||||
VN -> V
|
||||
NB -> N
|
||||
PH -> V
|
||||
KS -> B
|
||||
PP -> V
|
||||
PS -> C
|
||||
VB -> N
|
||||
FB -> N
|
65
2021/d14/ex2/ex2.py
Executable file
65
2021/d14/ex2/ex2.py
Executable file
|
@ -0,0 +1,65 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import itertools
|
||||
import sys
|
||||
from copy import deepcopy
|
||||
from typing import Counter, Dict, Iterator, List, NamedTuple, Tuple, TypeVar
|
||||
|
||||
|
||||
class Template(NamedTuple):
|
||||
bigrams: Counter[str]
|
||||
counts: Counter[str]
|
||||
|
||||
|
||||
Rules = Dict[str, str]
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
def nth(iterable: Iterator[T], n: int) -> T:
|
||||
return next(itertools.islice(iterable, n, None))
|
||||
|
||||
|
||||
def solve(input: List[str]) -> int:
|
||||
def parse() -> Tuple[Template, Rules]:
|
||||
bigrams = Counter(a + b for a, b in zip(input[0], input[0][1:]))
|
||||
counts = Counter(input[0])
|
||||
rules = {
|
||||
pair: insertion
|
||||
for pair, insertion in map(lambda s: s.split(" -> "), input[2:])
|
||||
}
|
||||
return Template(bigrams, counts), rules
|
||||
|
||||
def step(template: Template, rules: Rules) -> Template:
|
||||
bigrams: Counter[str] = Counter()
|
||||
counts = deepcopy(template.counts)
|
||||
for p, n in template.bigrams.items():
|
||||
if p in rules:
|
||||
insertion = rules[p]
|
||||
bigrams[p[0] + insertion] += n
|
||||
bigrams[insertion + p[1]] += n
|
||||
counts[insertion] += n
|
||||
else:
|
||||
# Counts are not changed in this case
|
||||
bigrams[p] = n
|
||||
return Template(bigrams, counts)
|
||||
|
||||
def polymerize(template: Template, rules: Rules) -> Iterator[Template]:
|
||||
while True:
|
||||
yield (template := step(template, rules))
|
||||
|
||||
def score(template: Template) -> int:
|
||||
nums = [n for __, n in template.counts.most_common()]
|
||||
return nums[0] - nums[-1]
|
||||
|
||||
template, rules = parse()
|
||||
return score(nth(polymerize(template, rules), 40 - 1))
|
||||
|
||||
|
||||
def main() -> None:
|
||||
input = [line.strip() for line in sys.stdin.readlines()]
|
||||
print(solve(input))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
102
2021/d14/ex2/input
Normal file
102
2021/d14/ex2/input
Normal file
|
@ -0,0 +1,102 @@
|
|||
NNSOFOCNHBVVNOBSBHCB
|
||||
|
||||
HN -> S
|
||||
FK -> N
|
||||
CH -> P
|
||||
VP -> P
|
||||
VV -> C
|
||||
PB -> H
|
||||
CP -> F
|
||||
KO -> P
|
||||
KN -> V
|
||||
NO -> K
|
||||
NF -> N
|
||||
CO -> P
|
||||
HO -> H
|
||||
VH -> V
|
||||
OV -> C
|
||||
VS -> F
|
||||
PK -> H
|
||||
OS -> S
|
||||
BF -> S
|
||||
SN -> P
|
||||
NK -> N
|
||||
SV -> O
|
||||
KB -> O
|
||||
ON -> O
|
||||
FN -> H
|
||||
FO -> N
|
||||
KV -> S
|
||||
CS -> C
|
||||
VO -> O
|
||||
SP -> O
|
||||
VK -> H
|
||||
KP -> S
|
||||
SK -> N
|
||||
NC -> B
|
||||
PN -> N
|
||||
HV -> O
|
||||
HS -> C
|
||||
CN -> N
|
||||
OO -> V
|
||||
FF -> B
|
||||
VC -> V
|
||||
HK -> K
|
||||
CC -> H
|
||||
BO -> H
|
||||
SC -> O
|
||||
HH -> C
|
||||
BV -> P
|
||||
OB -> O
|
||||
FC -> H
|
||||
PO -> C
|
||||
FV -> C
|
||||
BK -> F
|
||||
HB -> B
|
||||
NH -> P
|
||||
KF -> N
|
||||
BP -> H
|
||||
KK -> O
|
||||
OH -> K
|
||||
CB -> H
|
||||
CK -> C
|
||||
OK -> H
|
||||
NN -> F
|
||||
VF -> N
|
||||
SO -> K
|
||||
OP -> F
|
||||
NP -> B
|
||||
FS -> S
|
||||
SH -> O
|
||||
FP -> O
|
||||
SF -> V
|
||||
HF -> N
|
||||
KC -> K
|
||||
SB -> V
|
||||
FH -> N
|
||||
SS -> C
|
||||
BB -> C
|
||||
NV -> K
|
||||
OC -> S
|
||||
CV -> N
|
||||
HC -> P
|
||||
BC -> N
|
||||
OF -> K
|
||||
BH -> N
|
||||
NS -> K
|
||||
BN -> F
|
||||
PC -> C
|
||||
CF -> N
|
||||
HP -> F
|
||||
BS -> O
|
||||
PF -> S
|
||||
PV -> B
|
||||
KH -> K
|
||||
VN -> V
|
||||
NB -> N
|
||||
PH -> V
|
||||
KS -> B
|
||||
PP -> V
|
||||
PS -> C
|
||||
VB -> N
|
||||
FB -> N
|
Loading…
Reference in a new issue