function split(sum, ...results) {
// делим число на общее количество часов
const part = sum / results.reduce((a, b) => a + b);
// каждые часы умножаем на результат деления и округляем
const result = results.map(hours => Math.round(hours * part));
// финальная сумма с учётом округлений
const resultSum = result.reduce((a, b) => a + b);
// разница между финальной суммой и изначальной
const difference = sum - resultSum;
// если есть разница
if(difference) {
// выбираем рандомно счасливчика\неудачника
// за счёт которого компенсируем разницу
// поменяй если надо выбрать кого-то конкретного :)
const luckyIndex = Math.floor(Math.random() * result.length);
result[luckyIndex] += difference;
}
return result;
}
function transformArray(sourceArray) {
const arr = sourceArray.slice(0);
for (let max = Math.max(...arr); max > 0; max--) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === max) {
const startRange = Math.max(0, i - max);
const endRange = Math.min(arr.length - 1, i + max);
for (let i2 = startRange; i2 <= endRange; i2++) {
if (arr[i2] >= max) continue;
if (startRange > Math.max(0, i2 - arr[i2])) continue;
if (endRange < Math.min(arr.length - 1, i2 + arr[i2])) continue;
arr[i2] = -1;
}
}
}
}
return arr;
}
function processDirection(arr, first, end, step) {
let top = -1;
for (let i = first; i !== end; i += step) {
const value = arr[i];
if (value <= top) {
arr[i] = -1;
} else {
top = value;
}
top--;
}
}
function updateArray(arr) {
processDirection(arr, 0, arr.length, 1);
processDirection(arr, arr.length - 1, -1, -1);
return arr;
}
// --------
updateArray([5, 1, 1, 0, 2, 1, 1, 0]); // [5, -1, -1, -1, 2, -1, 1, -1]
function process (source) {
const result = source.slice(0);
const count = result.length;
result.forEach((n, i) => {
if (n > 0) {
const min = Math.max(i - n, 0);
const max = Math.min(i + n, count - 1);
for (let c = min; c <= max; c++) {
let check = result[c];
if (check < 1 || (check < n && c - check >= min && c + check <= max)) {
result[c] = -1;
}
}
}
});
return result;
}
Object.setPrototypeOf(obj, {toString: () => 10});
'*'
в качестве результата, реально вы выдаёте '*\n'
..join('\n')
. Ну и ещё пробелов не хватает после звёздочек.const christmasTree = length =>
Array.from({ length }, (n, i) => (
n = ' '.repeat(length - i - 1),
n + '*'.repeat(i * 2 + 1) + n
)).join('\n');
С(n,k) = min_i=1..n-1 ( max(C(i,k-1), C(n-i, k)) )) + 1