【JavaScript】华为机试_HJ20_密码验证合格程序

题目描述

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

合格的密码要求:

(1)长度不少于8位

(2)必须包含大写字母、小写字母、数字、特殊字符中的至少三种

(3)不能分割出两个独立的、长度大于2的连续子串,使得这两个子串完全相同

题目链接:https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841?tpId=37\&tqId=21243\&rp=1\&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37\&difficulty=undefined\&judgeStatus=undefined\&tags=\&title=

解答

第一次通过示例

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;
}
相关推荐
旧梦952712 小时前
Java 单例模式:从基础到实战的完整指南
java·开发语言·单例模式
小小晓.13 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
小磊哥er14 小时前
深入解构Claude Code - 第 5 篇 · 每次提问都给 AI 塞了什么资料
javascript·ai编程
小磊哥er14 小时前
深入解构Claude Code - 第 4 篇 · 工具:AI 的手
javascript·ai编程
格林威14 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
子非鱼a14 小时前
【WEB】[NewStarCTF 公开赛赛道]UnserializeOne
前端·javascript·html
chen<>14 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
一直C14 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
m0_7345717614 小时前
深入理解C++ 类型转换<三>const_cast
开发语言·c++
luj_176814 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法