题目描述
你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:
(1)长度不少于8位
(2)必须包含大写字母、小写字母、数字、特殊字符中的至少三种
(3)不能分割出两个独立的、长度大于2的连续子串,使得这两个子串完全相同
解答
第一次通过示例
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
let res = "OK";
let count = 0;
if (line.length < 8) {
console.log("NG");
continue;
}
count = line.match(/[A-Z]/) ? ++count : count;
count = line.match(/[a-z]/) ? ++count : count;
count = line.match(/[0-9]/) ? ++count : count;
count = line.match(/[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]/) ? ++count : count;
if (count < 3) {
console.log("NG");
continue;
}
for (let i = 0; i < line.length - 5; i++) {
let substr = line.slice(i, i+3);
if (i > 0 && line.slice(0, i).includes(substr)) {
res = "NG";
break;
} else if (i+3 < line.length && line.slice(i+3).includes(substr)) {
res = "NG";
break;
}
}
console.log(res);
}
}()
优化
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
if (isPassword(line)) {
console.log("OK");
} else {
console.log("NG");
}
}
}()
function isPassword (pwd) {
if (!pwd || pwd.length < 8) return false;
let matchCount = 0;
const regs = [/\d/g, /[A-Z]/g, /[a-z]/g, /\W/g];
regs.forEach( reg => matchCount = reg.test(pwd) ? ++matchCount : matchCount);
if (matchCount < 3) return false;
for (let i = 0; i < pwd.length - 5; i++) {
const substr = pwd.slice(i, i+3);
if (pwd.slice(i+3).includes(substr)) return false;
}
return true;
}