Home > Back-end >  Javascript - Online Coding assessment to mask credit cards numbers with #
Javascript - Online Coding assessment to mask credit cards numbers with #

Time:03-04

I got the below coding assessment question in Javascript. I tried my best to solve but there are few edge cases I missed. I need help to identify those missing cases

Usually when you buy something, you're asked whether your credit card number, phone number or answer to your most secret question is still correct. However, since someone could look over your shoulder, you don't want that shown on your screen. Instead, we mask it.

Your task is to write a function maskify, which will:

Mask all digits (0-9) with #, unless they are first or last four characters. Never mask credit cards with less than 6 characters. Never mask non-digit characters. Examples
Input   Output  Comments
"4556364607935616"  "4###########5616"
"4556-3646-0793-5616"   "4###-####-####-5616"
"64607935616"   "6######5616"
ABCD-EFGH-IJKLM-NOPQ    ABCD-EFGH-IJKLM-NOPQ
A1234567BCDEFG89HI  A#######BCDEFG89HI
"12345" "12345" No #s if less than 6 characters
""  ""  Make sure to handle empty strings
"Skippy"    "Skippy"
Documentation

maskify(cc)

Parameters: cc: String A string of any characters.

Guaranteed Constraints: The input string will never be null or undefined. Returns: String The input string with all but the first and last four characters replaced with '#'.

This is what I tried so far

function maskify (cc) {
  if (cc.length < 6) {
      let reversed = reverse(cc);
      let newString = '';
      for (let i = 0; i < reversed.length; i  ) {
        if (i < 4) {
          newString  = reversed[i];
        } else {
          newString  = '#';
        }
      }
      return reverse(newString);
  } else {
  return cc.slice(0, -4).replace(/./g, '#')   cc.slice(-4);
  }
}
 
function reverse(str) {
  return str.split("").reverse().join("");
}

Output

should mask the digits of standard credit cards
expected '############0694' to equal '5###########0694'
Completed in 2ms
should not mask the digits of short credit cards
expected '#4321' to equal '54321'

CodePudding user response:

This is my solution:

function maskify (cc) {
  // If less than 6 characters return full number
  if (cc.length < 6)
    return cc;
    
  // Take out first character
  let firstChar = cc.charAt(0);
  cc = cc.slice(1);
    
  // Replace characters except last 4
  cc = cc.replace(/\d(?=.{4,}$)/g, '#');
  
  // Add first character back
  cc = firstChar   cc;
  
  return cc;
}

// Run every example number
const tests = ["4556364607935616", "4556-3646-0793-5616", 
                "64607935616", "ABCD-EFGH-IJKLM-NOPQ",
                "A1234567BCDEFG89HI", "12345", "", "Skippy"];

tests.forEach((number) => console.log(`Testing: ${number} - Output: ${maskify(number)}`));

I ran it with all the numbers of your example and it gets the correct output.

  • Related