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