JSFiddle - React, Tailwind, and code Playground

by Pavel Kityan

JavaScript

var nominals = [],
  sum;

if (typeof window !== 'undefined') {
  var res = window.prompt('Give me 3 nominals and the sum. Separate with [SPACE]');
  if (res) {
    res = res.split(' ');
    nominals = [res[0] * 1, res[1] * 1, res[2] * 1].sort(function(a, b) {
      return a < b;
    });
    sum = res[3] * 1;
  }
  start();
} else {
  nominals = [process.argv[2] * 1, process.argv[3] * 1, process.argv[4] * 1].sort(function(a, b) {
    return a < b;
  });
  sum = process.argv[5] * 1;
  start();
}

function start() {

  for (var i = 0; i < 3; i++) {
    if (checkVal(nominals[i])) {
      output('Input error');
      return;
    }
  }
  if (checkVal(sum)) {
    output('Input error');
    return;
  }

  var inHand = calc(nominals, sum);

  output(`
We need ${sum}. 
We give: ${showInHand(inHand, nominals).join(' + ')} = ${getSumInHand(inHand, nominals)}.
` +
    ((getSumInHand(inHand, nominals) == sum) ? 'Yes, we can!' : 'No, we cannot.')
  );

}


function calc(nominals, sum) {

  var inHand = [0, 0, 0];

  for (var i = 0; i < 3; i++) {
    while (getSumInHand(inHand, nominals) < sum) {
      inHand[i]++;
    }
    if (getSumInHand(inHand, nominals) == sum) {
      return inHand;
    } else {
      inHand[i]--;
    }
  }

  // correcting #1 if still here

  if (inHand[0] > 0) {
    inHand[0]--;
    for (var i = 1; i < 3; i++) {
      while (getSumInHand(inHand, nominals) < sum) {
        inHand[i]++;
      }
      if (getSumInHand(inHand, nominals) == sum) {
        return inHand;
      } else {
        inHand[i]--;
      }
    }
  }

  // correcting #2 if still here

  if (inHand[1] > 0) {
    inHand[1]--;
    while (getSumInHand(inHand, nominals) < sum) {
      inHand[2]++;
    }
    if (getSumInHand(inHand, nominals) == sum) {
      return inHand;
    } else {
      inHand[i]--;
    }
  }

  return inHand;

}

function getSumInHand(inHand, nominals) {
  return [0, 1, 2].reduce(function(total, i) {
    return total + inHand[i] * nominals[i];
  }, 0);
}

function...