Valid3 returning invalid

Hi so I’m struggling a bit with the credit card checker project. I think I’ve done the correct code for the validateCred() function, however, valid3 is invalid? Is this supposed to happen at this point? Here is my code:

// All valid credit card numbers
const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8];
const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9];
const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6];
const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5];
const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6];

// All invalid credit card numbers
const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5];
const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3];
const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4];
const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5];
const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4];

// Can be either valid or invalid
const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4];
const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9];
const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3];
const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3];
const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3];

// An array of all the arrays above
const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5];

// Add your functions below:
const validateCred=(arr)=>{
  let valArr=[];
  for (let i = arr.length - 1; i >= 0; i--) {
    if (i%2===0){
      let doubledNum = arr[i]*2;
      if (doubledNum>9){
         valArr.push(doubledNum-9);
      }
      else {
        valArr.push(doubledNum);
      };
      }
    else{
      valArr.push(arr[i])
    };
    //console.log(valArr);
    };
     const addVals = (accumulator,currentValue)=>accumulator+currentValue;
    let total = valArr.reduce(addVals);
    //console.log(total);
    if (total%10===0){
      return true
    }
    else{
      return false
    }

  };
console.log(validateCred(valid1));
console.log(validateCred(valid2));
console.log(validateCred(valid3));
console.log(validateCred(valid4));
console.log(validateCred(valid5));
console.log(validateCred(invalid1));
console.log(validateCred(invalid2));
console.log(validateCred(invalid3));
console.log(validateCred(invalid4));
console.log(validateCred(invalid5));
console.log(validateCred(mystery1));
console.log(validateCred(mystery2));
console.log(validateCred(mystery3));
console.log(validateCred(mystery4));
console.log(validateCred(mystery5));

https://www.codecademy.com/paths/full-stack-engineer-career-path/tracks/fscp-javascript-syntax-part-ii/modules/fecp-challenge-project-credit-card-checker/projects/credit-card-checker

Hello, and welcome to the forums!

The issue is that valid3 is an American Express card and has only 15 digits, as opposed to the others that have 16 digits, so your strategy to determine if the double/check above 9 part needs to be run based on the index breaks down.

The last digit is the check digit and shouldn’t have the extra double/check above 9 step run on it. On a 15 digit card, the last index is 14, which passes your i%2===0 condition since it’s even. It continues on after that because the number at index 13 should go through the process, but it doesn’t because it’s odd.

It works out fine for your 16 digit cards.

Click if you'd like a strategy for dealing with it

One thing you could do to adapt your existing code is keep track of which digit you’re on in a separate counter, then using that counter in the condition where you check if it’s even with % 2.

You could create a variable before the for loop with an initial value of 0, then at the very beginning of the for loop you could increment it. Now you’d be able to use that new variable in place of i in your i % 2 === 0 condition.

The first loop will always be an odd number (1) so the check digit is skipped, and the rest of it works out too.

2 Likes

Thank you so much for your help!