日期:2025年2月13日
ZeroJudge 題目連結:e840. P7. 密碼強度測試(Passwords)
解題想法
按照題目給的規則計分就好,不過要注意連續數字的扣分方式,例如 1234,要扣的分數是 $(4-1) \times 2$。
Python 程式碼
使用時間約為 23 ms,記憶體約為 3.3 MB,通過測試。
digit = 0 # 數字數量
letter = 0 # 字母數量
cont = [] # 連續數字
s = input().strip() # 讀取字串,用 strip 去掉最後的 \0
c1 = s[0] # 處理 s 開頭的字元
if c1.isdigit(): # 如果 c1 是數字
digit += 1 # digit 加 1
cont.append([c1]) # [c1] 加到 cont
elif c1.isalpha(): letter += 1 # 如果 c1 是字母,letter 加 1
# 處理 s[1] ~ s[-1]
for i, c in enumerate(s[1:], start=1):
if c.isdigit(): # 如果 c 是數字
digit += 1 # digit 加 1
if s[i-1].isdigit(): # 如果 s-1 是數字
cont[-1].append(c) # c 加到 cont[-1]
else: cont.append([c]) # 如果 s-1 不是數字,[c] 加到 cont
elif c.isalpha(): letter += 1 # 如果 c 是字母,letter 加 1
# 計算分數
score = len(s)*3 + letter*3 + digit*2 # 處理長度、字母數量、數字數量
if len(s) >= 8 and digit > 0 and letter > 0: score += 10 # 達最低要求
else: score -= 5 # 未達最低要求
if digit == 0 and letter > 0: score -= letter # 只有英文字母
if digit > 0 and letter == 0: score -= digit # 只有數字
for con in cont: # 依序由 cont 讀取資料 con
if len(con) > 1: score -= (len(con)-1)*2 # 如果 con 長度大於 1,扣分
print(score) # 印出分數
C++ 程式碼
使用時間約為 2 ms,記憶體約為 340 kB,通過測試。
#include <iostream>
#include <string>
#include <vector>
#include <cctype> // for isdigit and isalpha
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int digit = 0, letter = 0; // 數字數量、字母數量
vector<vector<char>> cont; // 連續數字
string s; cin >> s; // 讀取字串
char c1 = s[0]; // 處理 s 開頭的字元
if (isdigit(c1)) { // 如果 c1 是數字
digit++; // digit 加 1
cont.push_back({c1}); // {c1} 加到 cont
} else if (isalpha(c1)) letter++; // 如果 c1 是字母,letter 加 1
/* 處理 s[1] ~ s[-1] */
for(int i=1; i<(int)s.size(); i++) {
char c = s[i];
if (isdigit(c)) { // 如果 c 是數字
digit++; // digit 加 1
if (isdigit(s[i-1])) cont.back().push_back(c); // 如果 s-1 是數字,c 加到 cont.back()
else cont.push_back({c}); // 如果 s-1 不是數字,{c} 加到 cont
} else if (isalpha(c)) letter++; // 如果 c 是字母,letter 加 1
}
/* 計算分數 */
int score = (int)s.size()*3 + letter*3 + digit*2; // 處理長度、字母數量、數字數量
if (s.size() >= 8 && digit > 0 && letter > 0) score += 10; // 達最低要求
else score -= 5; // 未達最低要求
if (digit == 0 && letter > 0) score -= letter; // 只有英文字母
if (digit > 0 && letter == 0) score -= digit; // 只有數字
for(auto con : cont) { // 依序由 cont 讀取資料 con
if (con.size() > 1) score -= ((int)con.size()-1)*2; // 如果 con 長度大於 1,扣分
}
cout << score << "\n"; // 印出分數
return 0;
}
沒有留言:
張貼留言