-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathday9.ts
104 lines (88 loc) · 2.87 KB
/
day9.ts
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
import { createSecureContext } from "tls";
const addAfterMarble = (value: number, marble) => {
const newMarble = {
value,
prev: marble,
next: marble.next,
};
marble.next.prev = newMarble;
marble.next = newMarble;
return newMarble;
};
const part2 = () => {
const numPlayers: number = 448;
const endMarble: number = 71628;
let curPlayer = 1;
let playerScores = [];
// All players start with score of zero
for (let i = 0; i < numPlayers; i += 1) {
playerScores[i] = 0;
}
// The starting marble is linked to itself
let curMarble = {
value: 0,
next: null,
prev: null
};
curMarble.next = curMarble;
curMarble.prev = curMarble;
for (let i = 1; i <= endMarble * 100; i++) {
if (i % 23 !== 0) {
// Add the new marble (i) to the slot after the current marble
// curMarble then gets updated to point to the newly added marble
curMarble = addAfterMarble(i, curMarble.next);
} else {
playerScores[curPlayer] += i;
curMarble = curMarble.prev.prev.prev.prev.prev.prev;
playerScores[curPlayer] += curMarble.prev.value;
curMarble.prev.prev.next = curMarble;
curMarble.prev = curMarble.prev.prev;
}
// Move to the next player
curPlayer++;
curPlayer %= numPlayers;
}
console.log(Math.max(...playerScores));
}
const part1 = () => {
const numPlayers: number = 448;
const endMarble: number = 71628;
let curMarble: number = 2;
let marbleCircle: number[] = [0, 1];
let curPos: number = 1;
let curPlayer: number = 2;
let playerScores: number[] = [];
// All players start with score of zero
for (let i = 0; i < numPlayers; i++) {
playerScores.push(0);
}
while (curMarble !== endMarble + 1) {
// Not a special marble, just place it
if (curMarble % 23 !== 0) {
if (curPos + 2 >= marbleCircle.length + 1) {
curPos = mod((curPos + 2), marbleCircle.length + 1) + 1;
} else {
curPos = mod((curPos + 2), marbleCircle.length + 1);
}
marbleCircle.splice(curPos, 0, curMarble);
} else {
playerScores[curPlayer] += curMarble;
curPos = mod((curPos - 7), marbleCircle.length);
playerScores[curPlayer] += marbleCircle[curPos];
marbleCircle.splice(curPos, 1);
}
// Move to the next marble
curMarble++;
// Move to the next player
curPlayer++;
curPlayer %= numPlayers;
}
console.log(Math.max(...playerScores));
};
const mod = (n: number, m: number): number => {
return ((n%m)+m)%m;
}
let start = new Date().getTime();
part2();
let end = new Date().getTime();
console.log(`Part 1 executed in ${end - start} ms`);