Help with No Repeats Please Algorithm

Help with No Repeats Please Algorithm
0

#1

Hi all, I’m having some trouble with this challenge. Here’s my code:

function permAlone(str) {
  var arr = str.split("");
  var numArr = [];
  var permArr = [];
  var permutation = 1;
  arr.forEach(function(value, index) {
    permutation = permutation * (index+1);
    numArr.push(index+1);
  });
  var reString = numArr.join("");
  var first = numArr[0];
  var last = numArr[numArr.length-1];
  var re = new RegExp("^" + ("[" + first + "-" + last + "]").repeat(numArr.length) + "$","g");
  var num = reString * numArr.length;
  
  
  function hasRepeatedNumbers(repeatNum) {
    repeatNum = repeatNum.toString().split("").sort().join("");
    var patt = new RegExp(/([0-9])\1+/,"g");
    var result = patt.test(repeatNum);
    return result;
}

  var x = num;
  while (x > 0) { 
    if (re.test(x) && !(hasRepeatedNumbers(x))) {
      permArr.push(x);
  }
    x--;
  }
   
  return permArr;
}

permAlone('aabb');

I attempted to switch up the strings into numbers and then find all permutations of those numbers. Currently my loop only pushes 13 numbers into my array. I can’t seem to understand why it’s not recognizing the other 3. Any help would be greatly appreciate.

Thanks!


#2

It looks like the issue has to do with Regular expression test() method, but I haven’t figured the real reason yet and how test() really actually works…, I went on MDN and found this mysterious excerpt (hopefully you will help me understand) :

As with exec() (or in combination with it), test() called multiple times on the same global regular expression instance will advance past the previous match.

So, I changed one line.

function permAlone(str) {
  var arr = str.split("");
  var numArr = [];
  var permArr = [];
  var permutation = 1;
  arr.forEach(function(value, index) {
    permutation = permutation * (index+1);
    numArr.push(index+1);
  });
  var reString = numArr.join("");
  var first = numArr[0];
  var last = numArr[numArr.length-1];
  // var re = new RegExp("^" + ("[" + first + "-" + last + "]").repeat(numArr.length) + "$","g");
  var num = reString * numArr.length;
  
  
  function hasRepeatedNumbers(repeatNum) {
    repeatNum = repeatNum.toString().split("").sort().join("");
    var patt = new RegExp(/([0-9])\1+/,"g");
    var result = patt.test(repeatNum);
    return result;
}

  var x = num;
  while (x > 0) { 
    if (new RegExp("^" + ("[" + first + "-" + last + "]").repeat(numArr.length) + "$","g").test(x) // replaced "re" with a newly created RegExp 
        && !(hasRepeatedNumbers(x))) {
      permArr.push(x);
  }
    x--;
  }
   
  return permArr;
}

permAlone('aabb');

Is that result what you expected ? :

update: I found a resource that I hope will help you : http://stackoverflow.com/questions/1520800/why-regexp-with-global-flag-in-javascript-give-wrong-results
Apparently, removing the “g” flag in RegExp() will fix this.


#3

That’s it exactly. Thanks for the help!