우박수열 정적분
Lv. 2
Solution
import { range } from '@algorithm/lib';
function* collatzConjecture(k: number) {
let n = k;
yield n;
while (1 < n) {
if (n % 2 === 0) {
n /= 2;
} else {
n = n * 3 + 1;
}
yield n;
}
}
export function hailStoneNumberDefiniteIntegral(k: number, ranges: [number, number][]): number[] {
const hailStoneNumber = [...collatzConjecture(k)];
const n = hailStoneNumber.length;
const prefixSumForWidth = [0];
for (const i of range(1, n)) {
const width = (hailStoneNumber[i - 1] + hailStoneNumber[i]) / 2;
prefixSumForWidth.push(prefixSumForWidth[i - 1] + width);
}
const getRangeWidth = ([startOffset, endOffset]: [number, number]) => {
const [start, end] = [startOffset, n + endOffset - 1];
if (end < start) {
return -1;
}
return prefixSumForWidth[end] - prefixSumForWidth[start];
};
return ranges.map(getRangeWidth);
}