Credit Checker not working for valid3 and invalid3

Hello, I have been stuck on the Luhn algorithm for a while. I read a lot and thought I figured it out and the code works for all of the Credit Cards except for valid3 and invalid3. I have calculated those manually and they should work but for some reason they don’t. I’ve figured out that the first number to be doubled does not get doubled before being added but I am not sure why when it works for all of the other CC numbers.

I’ve tried creating a reverse array etc but then the code seems to get further and further away from working again. The rest of my code seems to work although maybe it could be cleaned up.

// 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 = (array) => { //calculate the sum of all numbers in CC need new variable let sum = array[array.length - 1]; console.log(sum); //iterate backwards through CC. Do not count the last number. Once removed, every even number index gets doubled for (let i = array.length - 2; i >= 0; i--) { if (i % 2 === 0) { let doubled = array[i] * 2; //if the doubled number is larger than 9, subtract 9. add each number to the sum if (doubled > 9) { doubled -= 9; } sum += doubled; } else { sum += array[i]; } // console.log(array[i], sum); } //since we removed the last number, we have to add it back into the sum // sum += array[array.length - 1]; console.log(sum); //if the sum is divisible by 10, then it is valid and returns true. otherwise false and invalid.. if (sum % 10 === 0) { console.log("Valid"); return true; } else { console.log("Invalid"); return false; } }; let invalidCards = []; const findInvalidCards = (array) => { for (let i = 0; i < array.length; i++) { if (validateCred(array[i]) === false) { invalidCards.push(array[i]); } } return invalidCards; }; let badCompanies = []; const idInvalidCardCompanies = (invalidArray) => { for (let i = 0; i < invalidArray.length; i++){ switch(invalidArray[i][0]){ case 3: if (badCompanies.indexOf('Amex') === -1){ badCompanies.push('Amex'); } case 4: if (badCompanies.indexOf('Visa') === -1){ badCompanies.push('Visa'); } case 5: if (badCompanies.indexOf('MasterCard') === -1){ badCompanies.push('MasterCard'); } case 6: if (badCompanies.indexOf('Discover') === -1){ badCompanies.push('Discover'); } } } console.log(badCompanies); return badCompanies; } console.log(findInvalidCards(batch)); console.log(validateCred(invalid3)); console.log(idInvalidCardCompanies(invalidCards));

valid3 and invalid3 are a different length than the other arrays. (15 instead of 16)

Your code currently doubles the number and possibly subtracts 9 when index i is even (meaning this happens for numbers at even-numbered positions);
but that only matches the algorithm when the length of the original array is an even number.

If the length of the original array is odd, you’d do those modifications for the numbers at the odd-numbered indices.

This topic was automatically closed 41 days after the last reply. New replies are no longer allowed.