【中等】算法nodeJs:密码验证合格程序

61 阅读2分钟

描述

你需要书写一个程序验证给定的密码是否合格。

合格的密码要求:
∙长度不超过 8 位 注意题目写错了,是不得低于8位
∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙不能分割出两个独立的、长度大于 2 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 2 的独立子串 s1​,s2​ ,使得 s1​=s2​ ,那么密码不合法。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。

可见字符集为 ASCII 码在 33 到 126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。

/图片/AllAsciipng

输入描述:

本题将会给出 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);
    }
})();