Credit Card Checker Challenge Project

Can someone please take a look and see what can be fixed with my code? I’ve gotten it to the point where most of the “valid” and “invalid” arrays return true or false but for whatever reason, “valid3” consistently returns false and I’m not sure why. I’ve tried it for a couple of days and can’t quite crack it. I left a couple of console.log statements to try and figure out what was going on. Any and all help is appreciated! :raised_hands:

// 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 = (arr) => {
  let newArr = [];
  for (let i = arr.length - 1; i >= 0; i--) {
    if (i % 2 !== 0) {
      newArr.push(arr[i]);
    }
      else if (i % 2 === 0){
        if (arr[i] * 2 > 9) {
        newArr.push(arr[i] * 2 - 9);
      }
       else {
        newArr.push(arr[i] * 2);
      }
    }
   };
  let arrSum = arr => arr.reduce((first, second) => first + second)
  let algo = () => arrSum(newArr);
  console.log(newArr);
  console.log(`${arrSum(newArr)} modulo 10 = ${algo() % 10}`)
  if (arrSum(newArr) % 10 === 0) {
    return true
  } else {
    return false
  }
};
console.log(validateCred(valid3));
console.log(valid3.length);

You code would only work for cards that have a length that’s an even number.
valid3 has an odd-number length. (15 is odd)

The issue is what’s happening inside the for-loop.

You are modifying the digits (numbers) at the even indices, which matches the algorithm when the length of the array is even. But you should be modifying the numbers at the odd indices if the length of the array is odd.

The algorithm says to modify every other number, going backward, starting from the next-to-last number.
I recommend drawing a picture of what’s going for the algorithm on for arrays of different lengths - specifically which indices’ stuff needs to be modified and which doesn’t.

Thank you! I ended up making another if statement that checks the length of the array being passed in and executes the algorithm accordingly and it’s working! I’ll be back if I get stuck on the next steps :smiling_face_with_tear: lol