你在一家成長中的電子商務網站工作,而它也成了竊賊覬覦的對象。竊賊以猜測密碼的方式來存取顧客的帳號,這常常是輕而易舉的 (如「secret」、「password」、和「1234」)。如果你的顧客使用較好的密碼,你的公司就可以省點力氣來處理盜刷的問題。
你被賦與的任務為設計一個密碼分析器以告知顧客他們所選的密碼的強度。一個「強」密碼以增加長度或混用字母、數字及符號來增加猜測的難度。在這項工作中,一個「強」(Strong) 密碼擁有以下所有特性:
- 長度至少 8 個字元 (如:「spookyfish」)
- 同時有大寫及小寫字母 (如:「sPookyFISH」)
- 同時有字母及至少一個數字或符號 (如:「sPookyFiSH3」或「$PookyFI3H」)
一個「好」(GOOD) 密碼擁有兩個上述的特性,一個「尚可」(ACCEPTABLE) 密碼只擁有一個特性。不符合上述任何特性的則為「弱」(WEAK) 密碼。請寫一個程式來分析所給的密碼的強度。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每筆測資一行,其中含有一個密碼,長度最大為 30 字元。密碼中沒有空白。 | 依據上述的特性,輸出所輸入密碼的強度。 |
lizard aardvark Aardvark Aardvark77 | This password is WEAK This password is ACCEPTABLE This password is GOOD This password is STRONG |
解題思路
可以宣告一個 ans 變數計算密碼有達到幾種要求。
如果字串長度 >= 8 就 ans++。
宣告四個布林值,up、down、alpha、other,全部預設為 false,分別代表是否有大寫字母、小寫字母、英文字母、及其他字元。將密碼的每個字元進行判斷,可以使用 isalpha、isupper、islower 來做判斷,要先判斷字元是否為英文字母才可以判斷大小寫。如果不是英文字母的話就將 other 設為 true。
如果 up 和 down 皆為 true,就 ans++。
如果 alpha 和 other 皆為 true,也是 ans++。
最後依照達到多少要求輸出指定的答案。
範例程式碼-ZeroJudge A624: Password Analyzer
#include <iostream>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
map<int, string>MAP;
MAP[0] = "WEAK";
MAP[1] = "ACCEPTABLE";
MAP[2] = "GOOD";
MAP[3] = "STRONG";
string str;
while (cin >> str)
{
int ans = 0, len = int(str.length());
if (len >= 8) ans++;
bool up = false, down = false, alpha = false, other = false;
for (int i = 0; i<len; i++)
{
if (isalpha(str[i]))
{
alpha = true;
if (isupper(str[i])) up = true;
if (islower(str[i])) down = true;
}
else other = true;
}
if (up && down) ans++;
if (alpha && other) ans++;
cout << "This password is " << MAP[ans] << "\n";
}
}
//ZeroJudge A624
//Dr. SeanXD