-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
74 lines (57 loc) · 2.04 KB
/
index.js
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
const input = require("../../utils/getInput")(__dirname, { split: "" }).map(Number);
const parseData = (input) =>
input.reduce((acc, num, idx) => {
acc.push({ qty: num, val: idx % 2 ? "." : idx / 2 });
return acc;
}, []);
const calcResult = (data) => data.flatMap(({ qty, val }) => [...Array(qty)].map(() => (val === "." ? 0 : val))).reduce((acc, val, idx) => acc + val * idx, 0);
const firstPart = (input) => {
const data = parseData(input);
for (let idx = 0; idx < data.length; idx++) {
const current = data[idx];
if (current.val === ".") {
let { qty } = current;
const lastItemIdx = data.findLastIndex(({ val }) => val !== ".");
if (lastItemIdx < idx) {
continue;
}
const lastItem = data.splice(lastItemIdx, 1)[0];
if (lastItem.qty > qty) {
data.splice(lastItemIdx, 0, { ...lastItem, qty: lastItem.qty - qty });
data.splice(idx, 1, { ...lastItem, qty });
} else if (lastItem.qty < qty) {
data.splice(idx, 1, { val: ".", qty: qty - lastItem.qty });
data.splice(idx, 0, lastItem);
} else {
data.splice(idx, 1, lastItem);
}
}
}
return calcResult(data);
};
console.log(firstPart(input));
const secondPart = (input) => {
const data = parseData(input);
for (let idx = 0; idx < data.length; idx++) {
const current = data[idx];
if (current.val === ".") {
let { qty } = current;
const lastItemIdx = data.findLastIndex(({ val, qty: lqty }) => val !== "." && lqty <= qty);
if (lastItemIdx < idx) {
continue;
}
const lastItem = data.splice(lastItemIdx, 1)[0];
if (lastItem.qty > qty) {
} else if (lastItem.qty < qty) {
data.splice(lastItemIdx, 0, { qty: lastItem.qty, val: "." });
data.splice(idx, 1, { val: ".", qty: qty - lastItem.qty });
data.splice(idx, 0, lastItem);
} else {
data.splice(lastItemIdx, 0, { qty, val: "." });
data.splice(idx, 1, lastItem);
}
}
}
return calcResult(data);
};
console.log(secondPart(input));