Quick actions

cmd+k|ctrl+k

Navigation

Languages

Print variations DP

Snippet info

Language

JavaScript

Visibility

public

Author

beksultan280119

Created

2018-09-07T07:42:08Z

Updated

2018-09-07T07:42:08Z

const NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const SUM = 100;

function printVariation(operators, numbers) {
  const sequence = [numbers[0]];

  operators.forEach((o, index) => {
    sequence.push(o);
    sequence.push(numbers[index + 1]);
  });

  console.log(sequence.join(' '));
}

function joinNumbers(operators, numbers, currentSum, iteration) {
  const joinedNumbers = numbers.slice();
  const prevNum = joinedNumbers[joinedNumbers.length - 1];
  const joinedNum = prevNum * 10 + NUMS[iteration];
  let updatedSum = currentSum;
  joinedNumbers[joinedNumbers.length - 1] = joinedNum;

  if(operators.length) {
    prevOperation = operators[operators.length - 1];
    if (prevOperation === '+') {
      updatedSum -= prevNum;
      updatedSum += joinedNum;
    } else {
      updatedSum += prevNum;
      updatedSum -= joinedNum;
    }
  } else {
    updatedSum = joinedNum;
  }

  return {
    joinedNumbers,
    updatedSum
  }
}

function findVariations(operators = [], numbers = [NUMS[0]], currentSum = NUMS[0] , iteration = 1) {
  if (iteration > 8) {
    if (currentSum === SUM) {
      printVariation(operators, numbers);
    }
    return;
  }

  const nextNumbers = numbers.slice();
  nextNumbers.push(NUMS[iteration]); // Next number for '+' and '-'

  const v1 = operators.slice();
  v1.push('+');
  findVariations(v1, nextNumbers, currentSum + NUMS[iteration], iteration + 1);

  const v2 = operators.slice();
  v2.push('-')
  findVariations(v2, nextNumbers, currentSum - NUMS[iteration], iteration + 1);

  // Join two numbers
  const { joinedNumbers, updatedSum } = joinNumbers(operators, numbers, currentSum, iteration);
  findVariations(operators, joinedNumbers, updatedSum, iteration + 1);
}

findVariations();
INFO