<h1>👋 Array Addition</h1>
<div id="example1"></div>
<div id="example2"></div>
<div id="example3"></div>
<div id="example4"></div>
const prepareAddedNumbers = (originalSetOfNumberToBeAdded) => [
  originalSetOfNumberToBeAdded.map((number) => [number])
];

const performAdditionOperationOnGroupOfNumbers = ({
  originalSetOfNumberToBeAdded,
  indexOfNumberToBeAdded,
  indexOfGroupOfNumberToBeAdded,
  indexOfLastGroupOfNumberToBeAdded,
  numberToBeAdded
}) => {
  return originalSetOfNumberToBeAdded
    .map((originalNumber, indexOfOriginalNumber) => {
      if (
        indexOfOriginalNumber <=
        indexOfNumberToBeAdded +
          indexOfGroupOfNumberToBeAdded +
          indexOfLastGroupOfNumberToBeAdded
      ) {
        return;
      }

      return numberToBeAdded + originalNumber;
    })
    .filter(Boolean);
};

const arrayAdditionOperation = (
  preparedNumberToBeAdded,
  originalSetOfNumberToBeAdded
) => {
  if (preparedNumberToBeAdded.length === originalSetOfNumberToBeAdded.length) {
    return preparedNumberToBeAdded.flat(Infinity);
  }

  const indexOfLastGroupOfNumberToBeAdded = preparedNumberToBeAdded.length - 1;

  const newGroupOfNumberToBeAdded = preparedNumberToBeAdded[
    indexOfLastGroupOfNumberToBeAdded
  ]
    .map((groupOfNumberToBeAdded, indexOfGroupOfNumberToBeAdded) => {
      return groupOfNumberToBeAdded
        .map((numberToBeAdded, indexOfNumberToBeAdded) => {
          if (
            groupOfNumberToBeAdded.length > 1 &&
            indexOfNumberToBeAdded === groupOfNumberToBeAdded.length - 1
          ) {
            return;
          }

          return performAdditionOperationOnGroupOfNumbers({
            originalSetOfNumberToBeAdded,
            indexOfNumberToBeAdded,
            indexOfGroupOfNumberToBeAdded,
            indexOfLastGroupOfNumberToBeAdded,
            numberToBeAdded
          });
        })
        .filter(Boolean)
        .flat();
    })
    .filter((array) => array.length > 0);

  return arrayAdditionOperation(
    [...preparedNumberToBeAdded, newGroupOfNumberToBeAdded],
    originalSetOfNumberToBeAdded
  );
};

const arrayAddition = (input) => {
  const goal = Math.max(...input);
  const originalSetOfNumberToBeAdded = input.sort((a, b) => b - a).splice(1);

  return arrayAdditionOperation(
    prepareAddedNumbers(originalSetOfNumberToBeAdded),
    originalSetOfNumberToBeAdded
  ).includes(goal);
};

document.getElementById("example1").innerHTML =
  "[5, 7, 16, 1, 2] => " + arrayAddition([5, 7, 16, 1, 2]);

document.getElementById("example2").innerHTML =
  "[4, 6, 23, 10, 1, 3] => " + arrayAddition([4, 6, 23, 10, 1, 3]);

document.getElementById("example3").innerHTML =
  "[3, 5, -1, 8, 12] => " + arrayAddition([3, 5, -1, 8, 12]);

document.getElementById("example4").innerHTML =
  "[1, 1] => " + arrayAddition([1, 1]);

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.