-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday16question1.ts
More file actions
125 lines (91 loc) · 2.91 KB
/
day16question1.ts
File metadata and controls
125 lines (91 loc) · 2.91 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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { readFileSync } from "fs";
enum PacketType {
literal = 4,
}
class Packet {
public version: number;
constructor(version: number) {
this.version = version;
}
}
class Literal extends Packet {
public value: number;
constructor(version: number, value: number) {
super(version);
this.value = value;
}
}
class Operator extends Packet {
public subPackets: Packet[] = [];
}
class PacketProcessor {
public process(binaryPacket: string[]): Packet {
const packetVersion = parseInt(binaryPacket.splice(0, 3).join(""), 2);
const packetType = parseInt(binaryPacket.splice(0, 3).join(""), 2);
switch (packetType) {
case PacketType.literal: {
return new Literal(packetVersion, this.findLiteralValue(binaryPacket));
}
default: {
let operator = new Operator(packetVersion);
const lengthTypeId = binaryPacket.shift();
if (lengthTypeId === "0") {
let lengthOfSubpackets = parseInt(
binaryPacket.splice(0, 15).join(""),
2
);
let startingLength = binaryPacket.length;
while (startingLength - binaryPacket.length !== lengthOfSubpackets) {
operator.subPackets.push(this.process(binaryPacket));
}
} else {
let numberOfSubpackets = parseInt(
binaryPacket.splice(0, 11).join(""),
2
);
for (let i = 0; i < numberOfSubpackets; i++) {
operator.subPackets.push(this.process(binaryPacket));
}
}
return operator;
}
}
}
private findLiteralValue(binaryPacket: string[]): number {
let endingGroupFound = false;
let binaryLiteralValue = "";
while (!endingGroupFound) {
let processingGroup = binaryPacket.splice(0, 5);
if (processingGroup.shift() === "0") {
endingGroupFound = true;
}
binaryLiteralValue += processingGroup.join("");
}
return parseInt(binaryLiteralValue, 2);
}
}
function convertToBinary(hexString) {
let result: string = "";
for (let hexCharacter of hexString) {
let binaryString = parseInt(hexCharacter, 16).toString(2);
while (binaryString.length !== 4) {
binaryString = "0" + binaryString;
}
result += binaryString;
}
return result;
}
function findVersionTotal(packet: Packet): number {
let versionTotal = packet.version;
if (packet instanceof Operator) {
for (let subPacket of packet.subPackets) {
versionTotal += findVersionTotal(subPacket);
}
}
return versionTotal;
}
const rawInput = readFileSync("./day16inputs.txt", "utf8");
const binaryPacket = convertToBinary(rawInput).split("");
let packetProcessor = new PacketProcessor();
const packetTree = packetProcessor.process(binaryPacket);
console.log(findVersionTotal(packetTree));