Luhn Algorithm Help

Hey all. I’m having a problem on my valid card numbers printing exclusively true and my invalid printing exclusively false. I will attach my code to show y’all. Input and help are greatly appreciated.

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

console.log(validateCred(valid1));
console.log(validateCred(invalid1));

Your For Loop is only applying to every second number (which is what you want) But you never address the other numbers and add them into the “Sum” variable.

For example:
given the array of numbers: [2, 4, 5, 7, 4, 7, 8, 9, 5, 1]
Your code would only add the bold numbers to the ‘sum’ variable, leaving the other numbers (2,5,4,8,5) completely unaddressed.

In order for your code to address these numbers as well as the bold ones, you could simply make another For Loop, except this time, make it only address the non-bold numbers (2,5,4,8,5).

This may look something like:

// j starts on 0 so it addresses only the non-bold numbers (2,5,4,8,5) for (let j = 0; j < digit.length; j += 2) { sum += digit[j]; }

PLEASE NOTE make sure that you do not use the letter ‘i’ in the second for loop, use a different letter. (in the provided example I used the letter ‘j’)

I hope this helps, good luck!

1 Like

You’re incredible brother. That was the literal only missing piece for this code. And thank you for explaining why my code wasn’t working and how this fixes it. Awesome help!