Credit Card Checker

Hi there,

I’m in the middle of the Front-End Engineer course but I’m having some trouble with one of the challenges: Credit Card Checker.

I’m on the 3rd question, asking to write a function that will check whether a credit card number is valid using the Luhn Algorithm, which I have implemented to the best of my ability but I am having trouble when it comes to credit card numbers with more or less than the usual 16 numbers (e.g. valid3):

I’m providing a copy of my code below:

// 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:
function validateCred(array) {
  sum = 0;
  for(let i = array.length - 1; i >= 0; i--) {
    if(i % 2 === 0) {
      array[i] = (array[i] * 2);
      if((array[i] > 9)) {
         array[i] = array[i] - 9;
        }
      }
    sum = sum + array[i];
    console.log(sum);
  }
  if(sum % 10 === 0) {
    return true;
  } else {
    return false;
  }
}

console.log(validateCred(valid3));

valid3 should be outputting a sum of 60, making it valid but it is instead coming out with 66, making it false.

Your validateCred function will work on card arrays that have an even length.
In that case, the elements at even indices contain the numbers that have to be modified (doubled, etc) using the algorithm.

If the length of the array is an odd number, it won’t work as expected. You want to have the next-to-last one be doubled and then every other one moving backward. That would mean modifying the stuff at the odd indices.

Another possible solution is
to change

if(i % 2 === 0) {

to

if((length - i) % 2 === 0) { 

to test the index relative to the end of the array.

Yep, that seems to have done the trick! Thanks @janbazant1107978602