奋斗是万物之父。——陶行知
密码验证合格程序 题目:
你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:
- 长度超过 8位
- 必须包含大写字母、小写字母、数字、特殊字符中的至少三种
- 不能分割出两个独立的、长度大于 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 的独立子串 ,使得 ,那么密码不合法。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
可见字符集为 ASCII 码在 到 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
输入描述:
本题将会给出1≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾,每组测试数据描述如下:
在一行上输入一个长度为 1≦length(s)≦100 ,由可见字符构成的字符串s ,代表待判断的密码。
输出描述:
对于每一组测试数据,新起一行。若密码合格,输出 OK ,否则输出 NG 。
示例1:
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111
输出:
OK
NG
NG
OK
OK
说明:
对于第二组测试数据,“Abc9Abc1” 中存在两个长度大于 2 的独立子串 “Abc”。对于第三组测试数据,仅包含大写字母和数字,不满足条件。
示例2:
输入:
Abc1@
A1@ababa@1A
输出:
NG
OK
说明:
对于第一组测试数据,长度不足 8 位,不满足条件。
题解:
验证输入的长度,<8直接输出NG
验证输入串的每个字符,满足ASCII码四个段(大小写字母,数字,其他字符)其中三个以上
每次拆分三个字符串,看数组中的元素有两个还是以上
JS/Nodejs解答:
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
const pasdArr = [];
rl.on('line', (line) => {
pasdArr.push(line);
}).on('close', () => {
testPassword(pasdArr);
})
function testPassword (pasdArr) {
function testStr (s) {
if (s.length <= 8) return 'NG';
let [t1, t2, t3, t4] = [0, 0, 0, 0], count = 0;
for (let i = 0; i < s.length; i++) {
if (/[0-9]/.test(s.charAt(i))) t1++;
if (/[a-z]/) t2++;
if (/[A-Z]/) t3++;
if (/[^0-9^a-z^A-Z]/) t4++;
}
count = (t1 ? 1 : 0) + (t2 ? 1 : 0) + (t3 ? 1 : 0) + (t4 ? 1 : 0);
if (count < 3) return 'NG';
// 判断是否有长度大于 2 的包含公共元素的子串重复
for (let i = 0; i < s.length - 2; i++) {
let b = s.split(s.slice(i, i + 3));
if (b.length > 2) return 'NG'
}
return 'OK'
}
for (let i = 0; i < pasdArr.length; i++) {
console.log(testStr(pasdArr[i]));
}
}