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));