描述
你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:
∙长度不超过 8 位 注意题目写错了,是不得低于8位
∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙不能分割出两个独立的、长度大于 2 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 2 的独立子串 s1,s2 ,使得 s1=s2 ,那么密码不合法。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
可见字符集为 ASCII 码在 33 到 126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
输入描述:
本题将会给出 1≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每组测试数据描述如下:
在一行上输入一个长度为 1≦length(s)≦100 ,由可见字符构成的字符串 s ,代表待判断的密码。
输出描述:
对于每一组测试数据,新起一行。若密码合格,输出 OK ,否则输出 NG 。
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
const fn = (s) => {
if (s.length <= 8) return console.log("NG");
let num = 0;
num += (s.match(/[0-9]/g) || []).length ? 1 : 0;
num += (s.match(/[A-Z]/g) || []).length ? 1 : 0;
num += (s.match(/[a-z]/g) || []).length ? 1 : 0;
num += (s.match(/[\w_]/g) || []).length ? 1 : 0;
if (num < 3) return console.log("NG");
for (let i = 0; i < Math.ceil(s.length / 2); i++) {
for (let j = 3; j < Math.ceil(s.length / 2) - i; j++) {
if (s.slice(i + j).indexOf(s.slice(i, i + j)) !== -1) {
return console.log("NG");
}
}
}
return console.log("OK");
};
while ((line = await readline())) {
fn(line);
}
})();