Skip to content

Commit f7d97bd

Browse files
committed
Day 18
1 parent e4564d9 commit f7d97bd

File tree

5 files changed

+255
-3
lines changed

5 files changed

+255
-3
lines changed

Day 18 - TS/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# [Day 18](https://adventofcode.com/2021/day/18) in [TypeScript](https://www.typescriptlang.org/)

Day 18 - TS/input.txt

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
[[8,[6,[0,1]]],[8,[2,[1,9]]]]
2+
[[[5,[1,7]],9],[4,[[9,4],4]]]
3+
[[[1,[6,3]],8],[[3,[5,3]],[1,6]]]
4+
[0,[[1,[7,4]],[6,[7,3]]]]
5+
[[[7,6],2],[[[9,5],9],[[5,5],[6,3]]]]
6+
[[3,[[2,3],0]],0]
7+
[4,[2,[4,[2,6]]]]
8+
[[2,[8,[4,5]]],[[[7,7],7],1]]
9+
[[[[6,7],6],[9,8]],[[0,[7,3]],[[9,1],[2,0]]]]
10+
[0,[[[8,4],[4,9]],5]]
11+
[[0,7],[8,5]]
12+
[6,[[9,[0,7]],[[0,0],[8,1]]]]
13+
[[[[8,3],[1,9]],[[9,3],[6,5]]],4]
14+
[[[6,6],[[1,2],[1,7]]],[[8,8],[3,2]]]
15+
[[[6,4],[[0,3],1]],[[6,2],[4,[0,3]]]]
16+
[[[2,9],[[2,1],1]],[[6,[1,4]],[6,[0,3]]]]
17+
[9,[[7,4],[1,9]]]
18+
[[[[1,2],[7,8]],[[9,6],[1,3]]],[[0,6],[[3,6],6]]]
19+
[[[1,[8,6]],[2,[3,4]]],[[0,4],[5,[5,7]]]]
20+
[[[5,9],[[1,0],[4,3]]],[[7,[6,7]],[1,[1,5]]]]
21+
[[[[6,8],[5,9]],[5,[4,5]]],4]
22+
[[[[3,4],4],7],[[5,[3,7]],7]]
23+
[[[[3,3],[7,9]],[1,[4,8]]],0]
24+
[[[3,[9,4]],[1,[3,7]]],[[[1,8],1],[6,1]]]
25+
[3,[[[7,5],[4,8]],[7,8]]]
26+
[[7,[2,[2,4]]],[0,[8,[0,3]]]]
27+
[[[[8,5],3],[3,[8,3]]],[1,[0,[7,4]]]]
28+
[[[[7,1],3],[3,4]],[[3,7],[[1,8],[4,8]]]]
29+
[[[3,[9,9]],4],[[4,2],[[4,2],4]]]
30+
[[[5,[9,1]],[[3,5],[1,9]]],7]
31+
[[[[0,8],5],[9,[5,1]]],[[7,0],1]]
32+
[[[0,2],[[1,9],7]],[[0,3],[[0,3],[4,8]]]]
33+
[[[[1,8],0],[[8,6],[7,6]]],[[[1,8],4],[[0,4],[8,3]]]]
34+
[[[1,[2,7]],[[5,4],[5,0]]],[5,[8,[8,4]]]]
35+
[[[[4,4],[7,3]],[4,[2,3]]],[[[6,5],[1,5]],[5,[8,6]]]]
36+
[[[[7,8],4],[9,[4,2]]],[[[1,4],2],[0,7]]]
37+
[[8,4],[1,[2,5]]]
38+
[[[[2,5],4],[7,[0,2]]],[5,3]]
39+
[[3,[[7,4],3]],3]
40+
[[[3,5],[3,[1,4]]],[[[0,8],1],8]]
41+
[[[[1,9],5],[2,[4,8]]],[[[9,2],[0,1]],1]]
42+
[[[6,[1,5]],[[2,2],6]],[[1,[2,6]],5]]
43+
[[[3,2],[9,3]],[[2,1],[4,8]]]
44+
[[[[9,2],7],[[5,9],[1,2]]],[[[3,0],[2,8]],0]]
45+
[[[6,5],[[9,4],3]],[[[6,2],1],[0,7]]]
46+
[[[8,6],1],[9,[1,[0,1]]]]
47+
[[[[5,1],4],[8,[6,8]]],[4,[[1,8],9]]]
48+
[[[[1,1],[8,9]],[2,[0,6]]],3]
49+
[[[1,[8,3]],[[4,3],1]],[[[4,1],[8,6]],8]]
50+
[[8,[[6,2],8]],[[[4,0],8],6]]
51+
[[[[2,2],7],[[9,0],[3,3]]],[[[4,4],0],2]]
52+
[8,[[3,[9,1]],[0,[9,1]]]]
53+
[[[0,[4,2]],[[2,2],[8,7]]],[[6,[4,2]],[1,6]]]
54+
[[3,2],[4,[[6,2],2]]]
55+
[[6,[3,[2,9]]],[[9,[1,5]],[4,4]]]
56+
[[[[7,5],5],8],[1,[0,[2,7]]]]
57+
[[2,[[2,9],[1,6]]],[[[0,1],[0,2]],[4,[3,4]]]]
58+
[[[[8,9],[7,4]],[8,[6,5]]],1]
59+
[[8,9],[[2,[6,9]],[2,8]]]
60+
[[5,1],8]
61+
[[[8,[4,2]],[5,[1,8]]],[[0,[0,6]],[[6,7],9]]]
62+
[[[8,[8,0]],[[8,0],8]],[[[9,9],9],[9,[5,4]]]]
63+
[[[[3,3],5],[5,[9,0]]],[[2,6],[[3,8],[7,1]]]]
64+
[3,[[[1,5],8],5]]
65+
[[[9,8],[4,3]],5]
66+
[[[5,7],[[2,1],6]],[[4,2],[1,[0,2]]]]
67+
[[[[9,3],[9,8]],[[1,0],6]],[[[6,5],2],[[0,3],6]]]
68+
[8,[[[9,8],[2,8]],[1,0]]]
69+
[[8,[5,9]],[[[4,3],6],[[5,1],4]]]
70+
[[0,8],[1,[4,[6,3]]]]
71+
[3,[3,[6,[5,6]]]]
72+
[0,[0,[[8,0],8]]]
73+
[[0,4],[[7,4],[[0,7],1]]]
74+
[7,[[[6,3],[4,0]],1]]
75+
[9,[5,[[5,3],[2,8]]]]
76+
[[7,[[8,3],[1,7]]],[[[2,7],1],[[9,4],[7,1]]]]
77+
[[[0,[7,3]],3],2]
78+
[[1,[[9,0],2]],3]
79+
[[1,[7,[0,1]]],[[1,8],5]]
80+
[3,[5,[4,1]]]
81+
[3,[[[9,8],4],[4,[9,7]]]]
82+
[[2,9],[0,9]]
83+
[[[[7,1],[9,3]],[1,[1,8]]],9]
84+
[[[9,8],[[7,8],3]],[[1,[6,3]],[2,[7,3]]]]
85+
[[[7,3],[1,[5,5]]],[[4,8],[8,[2,5]]]]
86+
[[2,[[6,5],[4,6]]],[[0,3],7]]
87+
[[[4,[9,7]],[[6,1],6]],[[[8,1],6],[[2,5],9]]]
88+
[[[6,0],0],[9,9]]
89+
[[[[1,0],0],[[5,7],9]],[[[7,2],0],[9,6]]]
90+
[[[[5,0],[2,0]],[0,[7,5]]],[[[7,7],[2,4]],8]]
91+
[0,[[9,[3,4]],[[3,4],6]]]
92+
[[[0,8],[[1,5],[3,4]]],[[5,[6,4]],[[2,5],[2,5]]]]
93+
[[8,0],[[2,[7,9]],9]]
94+
[[[3,[7,0]],[3,[8,4]]],2]
95+
[[8,1],[[[8,9],[1,0]],3]]
96+
[[[8,3],[[4,8],4]],[[8,[8,8]],[0,2]]]
97+
[[0,[9,4]],[[6,8],[[7,1],9]]]
98+
[[[[5,3],[2,8]],[8,7]],[9,[[5,9],[5,2]]]]
99+
[2,[4,[[4,3],8]]]
100+
[[[[7,2],[6,4]],7],8]

Day 18 - TS/package.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"devDependencies": {
3+
"@types/lodash": "^4.14.178",
4+
"@types/node": "^16.11.15"
5+
},
6+
"dependencies": {
7+
"lodash": "^4.17.21"
8+
}
9+
}

Day 18 - TS/solution.ts

+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import { readFileSync } from 'fs';
2+
import { cloneDeep } from 'lodash';
3+
4+
5+
const file : string = readFileSync('./input.txt', 'utf-8');
6+
const lines : string[] = file.split(/\s+/);
7+
8+
interface regularNumber {
9+
value: number;
10+
depth: number;
11+
}
12+
13+
type snailfishNumber = regularNumber[]
14+
15+
function readSnailfishNumber(inputLine: string): snailfishNumber {
16+
let number: snailfishNumber = [];
17+
let depth: number = 0;
18+
for(let i = 0; i < inputLine.length; i++) {
19+
switch(inputLine[i]) {
20+
case '[':
21+
depth++;
22+
break;
23+
case ']':
24+
depth--;
25+
break;
26+
case ',':
27+
break;
28+
default:
29+
number.push({depth: depth, value: parseInt(inputLine[i])});
30+
}
31+
}
32+
return number;
33+
}
34+
35+
function snailfishNumberToStringInternal(number: snailfishNumber, depth: number = 0): string {
36+
let result: string = "";
37+
if(number.length == 0)
38+
return result;
39+
40+
if(number[0].depth == depth) {
41+
result += number[0].value;
42+
number.splice(0, 1);
43+
} else {
44+
result += "[";
45+
result += snailfishNumberToStringInternal(number, depth + 1);
46+
result += " ";
47+
result += snailfishNumberToStringInternal(number, depth + 1);
48+
result += "]";
49+
}
50+
return result;
51+
}
52+
53+
function snailfishNumberToString(number: snailfishNumber): string {
54+
return snailfishNumberToStringInternal(cloneDeep(number));
55+
}
56+
57+
function snailfishNumberMagnitudeInternal(number: snailfishNumber, depth: number = 0): number {
58+
let result: number = 0;
59+
if(number.length == 0)
60+
return result;
61+
62+
if(number[0].depth == depth) {
63+
result += number[0].value;
64+
number.splice(0, 1);
65+
} else {
66+
result += 3 * snailfishNumberMagnitudeInternal(number, depth + 1);
67+
result += 2 * snailfishNumberMagnitudeInternal(number, depth + 1);
68+
}
69+
70+
return result;
71+
}
72+
73+
function snailfishNumberMagnitude(number: snailfishNumber): number {
74+
return snailfishNumberMagnitudeInternal(cloneDeep(number));
75+
}
76+
77+
function addSnailfishNumbers(n1: snailfishNumber, n2: snailfishNumber): snailfishNumber {
78+
return n1.concat(n2).map((v) => {return {value: v.value, depth: v.depth+1}});
79+
}
80+
81+
// False if no explosion was required, true if it was performed
82+
function explodeSnailfishNumber(number: snailfishNumber): boolean {
83+
let explodeIndex = number.findIndex((v) => v.depth == 5);
84+
if(explodeIndex == -1)
85+
return false;
86+
87+
if(explodeIndex != 0) {
88+
number[explodeIndex - 1].value += number[explodeIndex].value;
89+
}
90+
if(explodeIndex + 2 < number.length) {
91+
number[explodeIndex + 2].value += number[explodeIndex + 1].value;
92+
}
93+
94+
number.splice(explodeIndex, 2);
95+
number.splice(explodeIndex, 0, {depth: 4, value: 0});
96+
return true;
97+
}
98+
99+
// Fale if no split was required, true if it was performed
100+
function splitSnailfishNumber(number: snailfishNumber): boolean {
101+
let splitIndex = number.findIndex((v) => v.value >= 10);
102+
if(splitIndex == -1)
103+
return false;
104+
let lvalue: number = Math.floor(number[splitIndex].value / 2);
105+
let rvalue: number = Math.ceil(number[splitIndex].value / 2);
106+
let newDepth: number = number[splitIndex].depth + 1;
107+
108+
number.splice(splitIndex, 1, {depth: newDepth, value: rvalue});
109+
number.splice(splitIndex, 0, {depth: newDepth, value: lvalue});
110+
111+
return true;
112+
}
113+
114+
function reduceSnailfishNumber(number: snailfishNumber) {
115+
while(true) {
116+
while(explodeSnailfishNumber(number));
117+
if(!splitSnailfishNumber(number))
118+
return;
119+
}
120+
}
121+
122+
let allNumbers: snailfishNumber[] = lines.map(line => readSnailfishNumber(line));
123+
124+
let n: snailfishNumber = allNumbers[0];
125+
for(let i = 1; i < lines.length; i++) {
126+
n = addSnailfishNumbers(n, readSnailfishNumber(lines[i]));
127+
reduceSnailfishNumber(n);
128+
//console.log(snailfishNumberToString(n));
129+
}
130+
131+
console.log(`Part 1: ${snailfishNumberMagnitude(n)}`);
132+
133+
let crossMagnitudes: number[] = [];
134+
for(let i = 0; i < allNumbers.length; i++) {
135+
for(let j = 0; j <allNumbers.length; j++) {
136+
let crossAdded: snailfishNumber = addSnailfishNumbers(allNumbers[i], allNumbers[j]);
137+
reduceSnailfishNumber(crossAdded);
138+
crossMagnitudes.push(snailfishNumberMagnitude(crossAdded));
139+
}
140+
}
141+
142+
console.log(`Part 2: ${Math.max.apply(null, crossMagnitudes)}`);

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
Done in variety of languages
33

44
### Progress
5-
![](https://img.shields.io/badge/days%20completed%20📅-19-blue)
5+
![](https://img.shields.io/badge/days%20completed%20📅-20-blue)
66

7-
![](https://img.shields.io/badge/stars%20⭐-38-yellow)
7+
![](https://img.shields.io/badge/stars%20⭐-40-yellow)
88

99
![](https://img.shields.io/badge/languages%20💬-17-red)
1010

@@ -20,7 +20,7 @@ Done in variety of languages
2020
|2|C# (.NET Core 6.0)||15|Scala|
2121
|3|C++||16|Scala|
2222
|4|TypeScript||17|JavaScript|
23-
|5|Kotlin||18||
23+
|5|Kotlin||18|TypeScript|
2424
|6|Haskell||19||
2525
|7|R||20|Dart|
2626
|8|Python||21|CoffeeScript|

0 commit comments

Comments
 (0)