熱門文章

2025年2月13日 星期四

ZeroJudge 解題筆記:e840. P7. 密碼強度測試(Passwords)

作者:王一哲
日期: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;
}


沒有留言:

張貼留言