-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday9.ts
105 lines (88 loc) · 2.16 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
105
import { textInput } from "./day9Data";
const day9TestData: string = `35
20
15
25
47
40
62
55
65
95
102
117
150
182
127
219
299
277
309
576`;
var NumbersArr = textInput.split("\n").map((item) => {
return parseInt(item);
});
const testPreamble = 5;
const preamble = 25;
const day9twoSum = (arr: number[], S: number): any[] => {
var sums = [];
var hashTable: any = {};
// check each element in array
for (var i = 0; i < arr.length; i++) {
// calculate S - current element
var sumMinusElement = S - arr[i];
// check if this number exists in hash table
// if so then we found a pair of numbers that sum to S
if (hashTable[sumMinusElement.toString()] !== undefined) {
sums.push([arr[i], sumMinusElement]);
}
// add the current number to the hash table
hashTable[arr[i].toString()] = arr[i];
}
// return all pairs of integers that sum to S
return sums;
};
const day9Result = NumbersArr.find((number, idx, numbers) => {
if (idx < preamble) {
return false;
}
const previousNumbers = numbers.slice(idx - preamble, idx);
if (day9twoSum(previousNumbers, number).length > 0) {
return false;
} else if (day9twoSum(previousNumbers, number).length == 0) {
return number;
}
});
console.log(day9Result);
// part 2
subArraySum(NumbersArr, NumbersArr.length, day9Result);
function subArraySum(arr: number[], n: number, sum: number) {
let curr_sum = arr[0],
start = 0,
i;
// Pick a starting point
for (i = 1; i <= n; i++) {
// If curr_sum exceeds the sum,
// then remove the starting elements
while (curr_sum > sum && start < i - 1) {
curr_sum = curr_sum - arr[start];
start++;
}
// If curr_sum becomes equal to sum,
// then return true
if (curr_sum == sum) {
let p = i - 1;
console.log("Sum found between indexes " + start + " and " + p);
let contigousArr = [...arr].slice(start, p + 1);
console.log(
`Final Contigous sum:`,
Math.min(...contigousArr) + Math.max(...contigousArr)
);
return 1;
}
// Add this element to curr_sum
if (i < n) curr_sum = curr_sum + arr[i];
}
console.log("No subarray found");
return 0;
}