Skip to content

Commit 14ffa5f

Browse files
authored
Solve day15 deno.ts (#100)
1 parent 908d6d7 commit 14ffa5f

File tree

6 files changed

+133
-1
lines changed

6 files changed

+133
-1
lines changed

days/day-15/io/arxcis.input

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
15
2+
5
3+
1
4+
4
5+
7
6+
0

days/day-15/io/arxcis.output

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1259
2+
689

days/day-15/solutions/day15.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { whatIsTheNthSpokenNumber } from "../../../lib/whatIsTheNthSpokenNumber.ts"
2+
const input = (await Deno.readTextFile("/dev/stdin"))
3+
const lines = [...input.matchAll(/\d+/g)]
4+
5+
const numbers = lines
6+
.map(([it]) => parseInt(it))
7+
8+
// Part 1
9+
{
10+
console.log(`${whatIsTheNthSpokenNumber(numbers, 2020)}`)
11+
}
12+
13+
// Part 2
14+
{
15+
console.log(`${whatIsTheNthSpokenNumber(numbers, 30000000)}`)
16+
}

days/day-15/test.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ echo ""
77
echo "--- Day 15: --- Rambunctious Recitation ---"
88
#$D/../../lang/go.sh "$D/solutions/*.go" "$D/io/*"
99
#$D/../../lang/sml.sh "$D/solutions/*.sml" "$D/io/*"
10+
$D/../../lang/deno.sh "$D/solutions/*.ts" "$D/io/*"
1011
$D/../../lang/python.sh "$D/solutions/*.py" "$D/io/*"
11-
#$D/../../lang/deno.sh "$D/solutions/*.ts" "$D/io/*"
1212
echo ""
13+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { whatIsTheNthSpokenNumber } from "./whatIsTheNthSpokenNumber.ts"
2+
3+
expect(`The ${4}th spoken number`, 0, whatIsTheNthSpokenNumber([0,3,6], 4))
4+
expect(`The ${5}th spoken number`, 3, whatIsTheNthSpokenNumber([0,3,6], 5))
5+
expect(`The ${6}th spoken number`, 3, whatIsTheNthSpokenNumber([0,3,6], 6))
6+
expect(`The ${7}th spoken number`, 1, whatIsTheNthSpokenNumber([0,3,6], 7))
7+
expect(`The ${8}th spoken number`, 0, whatIsTheNthSpokenNumber([0,3,6], 8))
8+
expect(`The ${9}th spoken number`, 4, whatIsTheNthSpokenNumber([0,3,6], 9))
9+
expect(`The ${10}th spoken number`, 0, whatIsTheNthSpokenNumber([0,3,6], 10))
10+
11+
expect(`The ${4}th spoken number`, 0, whatIsTheNthSpokenNumber([2,1,3], 4))
12+
expect(`The ${5}th spoken number`, 0, whatIsTheNthSpokenNumber([2,1,3], 5))
13+
expect(`The ${6}th spoken number`, 1, whatIsTheNthSpokenNumber([2,1,3], 6))
14+
15+
expect(`The ${2020}th spoken number`, 10, whatIsTheNthSpokenNumber([2,1,3], 2020))
16+
expect(`The ${2020}th spoken number`, 27, whatIsTheNthSpokenNumber([1,2,3], 2020))
17+
expect(`The ${2020}th spoken number`, 78, whatIsTheNthSpokenNumber([2,3,1], 2020))
18+
expect(`The ${2020}th spoken number`, 438, whatIsTheNthSpokenNumber([3,2,1], 2020))
19+
expect(`The ${2020}th spoken number`, 1836, whatIsTheNthSpokenNumber([3,1,2], 2020))
20+
expect(`The ${2020}th spoken number`, 1259, whatIsTheNthSpokenNumber([15,5,1,4,7,0], 2020))
21+
22+
expect("The 30000000th spoken number", 175594, whatIsTheNthSpokenNumber([0,3,6], 30000000))
23+
expect("The 30000000th spoken number", 2578, whatIsTheNthSpokenNumber([1,3,2], 30000000))
24+
expect("The 30000000th spoken number", 3544142, whatIsTheNthSpokenNumber([2,1,3], 30000000))
25+
expect("The 30000000th spoken number", 261214, whatIsTheNthSpokenNumber([1,2,3], 30000000))
26+
expect("The 30000000th spoken number", 6895259, whatIsTheNthSpokenNumber([2,3,1], 30000000))
27+
expect("The 30000000th spoken number", 18, whatIsTheNthSpokenNumber([3,2,1], 30000000))
28+
expect("The 30000000th spoken number", 362, whatIsTheNthSpokenNumber([3,1,2], 30000000))
29+
30+
31+
32+
function expect<T>(name: string, expected: T, actual: T) {
33+
if (expected === actual) {
34+
console.info(`[TEST PASS ✅] Expected ${name} to be ${expected} Actual: ${actual}`)
35+
} else {
36+
console.info(`[TEST FAIL ❌] Expected ${name} to be ${expected} Actual: ${actual}`)
37+
}
38+
}

lib/whatIsTheNthSpokenNumber.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
type SpokenNumberType = {
2+
value: number;
3+
lastSpokenTurn: number;
4+
spokenTurnBeforeThat?: number;
5+
}
6+
7+
export function whatIsTheNthSpokenNumber(initialNumbers: number[], N: number): number{
8+
9+
//
10+
// Inital round where everyone speaks the initial numbers in sequential order
11+
//
12+
const spokenNumbers = initialNumbers.map((num, i) => ({
13+
value: num,
14+
lastSpokenTurn: i+1,
15+
})) as SpokenNumberType[];
16+
17+
const spokenMap = new Map(spokenNumbers.map(it => [it.value, it]));
18+
19+
//
20+
// Actual game starts here, where the next number is calculated based on what was previously spoken.
21+
//
22+
23+
// if initial numbers are [1,2,3] -> should be 3th turn now with lastspoken number 3
24+
let turn = spokenNumbers.length;
25+
let lastSpokenNumber = spokenNumbers[spokenNumbers.length-1]
26+
27+
while (turn < N) {
28+
++turn;
29+
30+
// If the last number is a NEW number which has not been spoken before, speak zero!
31+
if (!lastSpokenNumber.spokenTurnBeforeThat) {
32+
let zeroNumber = spokenMap.get(0)
33+
if (!zeroNumber) {
34+
zeroNumber = {
35+
value: 0,
36+
lastSpokenTurn: turn,
37+
}
38+
spokenMap.set(0, zeroNumber)
39+
} else {
40+
zeroNumber.spokenTurnBeforeThat = zeroNumber.lastSpokenTurn
41+
zeroNumber.lastSpokenTurn = turn
42+
}
43+
lastSpokenNumber = zeroNumber
44+
} else {
45+
// ...else the diff is the next spoken number
46+
const diff = lastSpokenNumber.lastSpokenTurn - lastSpokenNumber.spokenTurnBeforeThat
47+
48+
let nextSpokenNumber = spokenMap.get(diff)
49+
50+
// if the next spoken number been spoken before...
51+
if (nextSpokenNumber) {
52+
nextSpokenNumber.spokenTurnBeforeThat = nextSpokenNumber.lastSpokenTurn;
53+
nextSpokenNumber.lastSpokenTurn = turn;
54+
lastSpokenNumber = nextSpokenNumber
55+
} else {
56+
// ...else add the next spoken number to the map of spoken numbers
57+
const nextSpokenNumber = {
58+
value: diff,
59+
lastSpokenTurn: turn,
60+
} as SpokenNumberType
61+
62+
spokenMap.set(diff, nextSpokenNumber)
63+
lastSpokenNumber = nextSpokenNumber
64+
}
65+
}
66+
}
67+
68+
return lastSpokenNumber.value;
69+
}

0 commit comments

Comments
 (0)