-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path5-kyu-how-many-numbers-ii.js
107 lines (91 loc) · 2.66 KB
/
5-kyu-how-many-numbers-ii.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
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
106
107
// 5 kyu | How Many Numbers? II
// https://www.codewars.com/kata/how-many-numbers-ii/train/javascript
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// /**
// * @param {number} n
// */
// const digitSum = n =>
// [...n.toString()].reduce((acc, curr) => acc + parseInt(curr, 10), 0);
// /**
// * @param {number[]} a
// */
// const mean = a => a.reduce((acc, curr) => acc + curr) / a.length;
// /**
// * @param {number[]} a
// * @param {number} n
// * @returns
// */
// const closest = (a, n) => {
// let cv = a[0];
// for (let v of a.slice(1)) {
// if (
// Math.abs(Math.abs(v) - Math.abs(n)) < Math.abs(Math.abs(cv) - Math.abs(n))
// )
// cv = v;
// }
// return cv;
// };
// /**
// * @param {number} nmax
// * @param {number} maxsm
// */
// const maxSumDig = (nmax, maxsm) => {
// const results = [];
// for (let i = 1000; i <= nmax; i++) {
// if (digitSum(i) <= maxsm) results.push(i);
// }
// // console.log(results);
// // console.log(mean(results));
// return [
// results.length,
// closest(results, mean(results)),
// results.reduce((acc, curr) => acc + curr),
// ];
// };
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/**
* @param {number} nmax
* @param {number} maxsm
*/
const maxSumDig = (nmax, maxsm) => {
const found = [];
let foundSum = 0;
loop: for (let i = 1000; i <= nmax; i++) {
let digits = [];
let tmp = i;
while (0 < tmp) {
digits.push(tmp % 10);
tmp = Math.trunc(tmp / 10);
}
for (let i = 0, sum; i < digits.length - 3; i++) {
if ('undefined' === typeof sum) {
sum = digits[i] + digits[i + 1] + digits[i + 2] + digits[i + 3];
} else {
sum = sum - digits[i - 1] + digits[i + 3];
}
if (maxsm < sum) continue loop;
}
found.push(i);
foundSum += i;
}
const mean = foundSum / found.length;
let closest = found[0];
for (let i = 1; i < found.length; i++) {
if (
Math.abs(Math.abs(found[i]) - Math.abs(mean)) <
Math.abs(Math.abs(closest) - Math.abs(mean))
)
closest = found[i];
}
const result = [found.length, closest, foundSum];
return result;
};
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
import { deepStrictEqual } from 'assert';
deepStrictEqual(maxSumDig(2000, 3), [11, 1110, 12555]);
deepStrictEqual(maxSumDig(2000, 4), [21, 1120, 23665]);
deepStrictEqual(maxSumDig(2000, 7), [85, 1200, 99986]);
deepStrictEqual(maxSumDig(3000, 7), [141, 1600, 220756]);
deepStrictEqual(maxSumDig(4000, 4), [35, 2000, 58331]);
console.log(maxSumDig(1009, 2));
console.log(maxSumDig(10010, 3));