描述
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合”大小写混合“
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
= 90: 非常安全
= 80: 安全(Secure)
= 70: 非常强
= 60: 强(Strong)
= 50: 一般(Average)
= 25: 弱(Weak)
= 0: 非常弱(Very_Weak)
对应输出为:
VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK
请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./ (ASCII码:0x21~0x2F)
:;<=>?@ (ASCII码:0x3A~0x40)
[]^_` (ASCII码:0x5B~0x60)
{|}~ (ASCII码:0x7B~0x7E)
提示:
1 <= 字符串的长度<= 300
输入描述:
输入一个string的密码
输出描述:
输出密码等级
示例1
输入:
38$@NoNoN
输出:
VERY_SECURE
说明:
样例的密码长度大于等于8个字符,得25分;
大小写字母都有所以得20分;
有两个数字,所以得20分;
包含大于1符号,所以得25分;
由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分。
示例2
输入:
Jl)M:+
输出:
AVERAGE
说明:
示例2的密码强度为10+20+0+25+0=55分。
题解
使用 TypeScript 编写如下代码:
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", function (password: string) {
let lengthScore = 0;
let letterScore = 0;
let digitScore = 0;
let symbolScore = 0;
let bonusScore = 0;
// 密码长度得分
if (password.length <= 4) {
lengthScore = 5;
} else if (password.length >= 5 && password.length <= 7) {
lengthScore = 10;
} else if (password.length >= 8) {
lengthScore = 25;
}
// 字母得分
let hasLowerCase = false;
let hasUpperCase = false;
for (let i = 0; i < password.length; i++) {
if (password[i] >= "a" && password[i] <= "z") {
hasLowerCase = true;
} else if (password[i] >= "A" && password[i] <= "Z") {
hasUpperCase = true;
}
}
if (!hasLowerCase && !hasUpperCase) {
letterScore = 0;
} else if (hasLowerCase && hasUpperCase) {
letterScore = 20;
} else {
letterScore = 10;
}
// 数字得分
let digitCount = 0;
for (let i = 0; i < password.length; i++) {
if (password[i] >= "0" && password[i] <= "9") {
digitCount++;
}
}
if (digitCount === 0) {
digitScore = 0;
} else if (digitCount === 1) {
digitScore = 10;
} else {
digitScore = 20;
}
// 符号得分
let symbolCount = 0;
for (let i = 0; i < password.length; i++) {
const char = password[i];
if (
(char >= "!" && char <= "/") ||
(char >= ":" && char <= "@") ||
(char >= "[" && char <= "`") ||
(char >= "{" && char <= "~")
) {
symbolCount++;
}
}
if (symbolCount === 0) {
symbolScore = 0;
} else if (symbolCount === 1) {
symbolScore = 10;
} else {
symbolScore = 25;
}
// 奖励的分
if ((hasLowerCase || hasUpperCase) && digitCount) {
bonusScore = 2
}
if ((hasLowerCase || hasUpperCase) && digitCount && symbolCount) {
bonusScore = 3
}
if (hasLowerCase && hasUpperCase && digitCount && symbolCount) {
bonusScore = 5
}
// 计算总分
const totalScore =
lengthScore + letterScore + digitScore + symbolScore + bonusScore;
// 确定密码等级
let securityLevel;
if (totalScore >= 90) {
securityLevel = "VERY_SECURE";
} else if (totalScore >= 80) {
securityLevel = "SECURE";
} else if (totalScore >= 70) {
securityLevel = "VERY_STRONG";
} else if (totalScore >= 60) {
securityLevel = "STRONG";
} else if (totalScore >= 50) {
securityLevel = "AVERAGE";
} else if (totalScore >= 25) {
securityLevel = "WEAK";
} else {
securityLevel = "VERY_WEAK";
}
console.log(securityLevel)
});