Credit Card Checker - Valid3 doesn't work

Hello,

I have a problem with this Challenge Project : Credit Card Checker.
I had read some topics but I still don’t understand why I’m wrong with valid3.
I will try to explain my code but ask me if it’s not clear.
I would be grateful for an explanation, thank you so much.

// 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];
// 6 13 15 21 23 25 25 26 35 44 51 56 60 63 69 
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 newArr = []; // Add new values
 // If valid3.length === 15, valid3.length-1 allows me to get all indices of the array and valid3.length-2 === 13 and this allows me to separate the last number of the array (valid1, valid2, valid3, and others)  which, even if it is even, cannot be doubled in this for loop // Index for valid3 -> 14 values with index [0,1,2,3,4,5,6,7,8,9,10,11,12,13] (I add the 15th value after)
  for (let i= arr.length-2; i>=0; i--){
// My 1st iteration for valid3 is 13%2 === 0 -> false so I push the value of index 13 in newArr without be doubled. My 2nd will be doubled, etc.
    if (i%2===0 && arr[i]*2>9){ 
      newArr.push(arr[i]*2-9)
    }
    else if(i%2 === 0){
      newArr.push(arr[i]*2)
    }
    else {
      newArr.push(arr[i])
    }
  }
  // Here, I have newArr with 14 values and I'm adding the last one with lastNumber
  let lastNumber = arr[arr.length-1];
  newArr.push(lastNumber);
  let somme = 0;
  for (let j = 0; j < newArr.length; j++) {
  somme += newArr[j];
  }
  console.log(somme)
}

validateCred(valid3)

I still don’t understand why somme of valid3 doesn’t return a number that can be modulo by 10.

If I put arr.length-1 it’s working for all valid card except valid3 and I understand because I take all indices of the array.
But if I put arr.length-2 I separate the last digit of my array. If the last digit of valid3 is even, it can’t be doubled, is it exact ?

Thank you,

You seem to have doubled (and subtracted 9 if necessary) for the elements at the even-numbered indices of the array.
(You checked whether i%2 === 0 and if so, did that stuff for arr[i]. )

But that only matches the algorithm when the length of the array is an even number.
(The algorithm says to do that stuff for every other element starting with the next-to-last element.)
Which would mean doing that at even-numbered indices if the length is even, but odd numbered indices if the length is odd.

A possible fix is to check whether difference between the length and that index is an even number instead of checking whether the index is an even number.

2 Likes

Hello,

Thank you for your answer !
It disturbed me so much that I dreamed about it last night! :smiley:
I understand my mistake, next time I would repeat the statement to myself