-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday14question1.ts
More file actions
89 lines (63 loc) · 2.1 KB
/
day14question1.ts
File metadata and controls
89 lines (63 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
class PairInsertionRule {
private pair: string;
private _insertedCharacter: string;
public get insertedCharacter(): string {
return this._insertedCharacter;
}
private set insertedCharacter(value: string) {
this._insertedCharacter = value;
}
constructor(pair: string, insertedCharacter: string) {
this.pair = pair;
this.insertedCharacter = insertedCharacter;
}
public applies(pair: string) {
return this.pair === pair;
}
}
class PolymerProcessor {
private insertionRules: PairInsertionRule[];
constructor(insertionRules: PairInsertionRule[]) {
this.insertionRules = insertionRules;
}
public process(template: string) {
let generatedTemplate = "";
for (let i = 0; i < template.length - 1; i++) {
let pair = template.slice(i, i + 2);
let insertionRule = this.insertionRules.find((r) => r.applies(pair));
if (insertionRule !== undefined) {
generatedTemplate += pair[0] + insertionRule.insertedCharacter;
}
}
return generatedTemplate + template[template.length - 1];
}
}
import { readFileSync } from "fs";
let inputs: string[];
const rawData = readFileSync("./day14inputs.txt", "utf8");
inputs = rawData.split("\r\n").filter((i) => i !== "");
let template = inputs.shift();
let insertionRules = inputs.map((i) => {
let [pair, insertionCharacter] = i.split(" -> ");
return new PairInsertionRule(pair, insertionCharacter);
});
let processor = new PolymerProcessor(insertionRules);
const steps = 40;
let mutatedTemplate = template;
for (let i = 0; i < steps; i++) {
mutatedTemplate = processor.process(mutatedTemplate);
}
const elements = new Set(mutatedTemplate);
const elementFrequency = new Map();
for (let element of Array.from(elements)) {
elementFrequency.set(
element,
mutatedTemplate.split("").filter((e) => e === element).length
);
}
const orderedFrequencies = Array.from(elementFrequency.values()).sort(
(a, b) => b - a
);
console.log(
orderedFrequencies[0] - orderedFrequencies[orderedFrequencies.length - 1]
);