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

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=e840
TOI 新手同好會 歷屆考題

  • 題目敘述遺漏「密碼最低要求」的條件:
    • 1: 密碼最少包含8個字元
    • 2: 同時包含英文字元和數字字元
#include <iostream>
using namespace std;

int n, e, d, a, score;
string s;

int main() {
    cin >> s;
    n = s.length();
    for (int i = 0; i < n; i++){
        if ('0' <= s[i] && s[i] <= '9'){
            d++;
            if (i != 0 && '0' <= s[i-1] && s[i-1] <= '9') a++;
        }
        else e++;
    }
    score = n*3 + e*3 + d*2;
    if (!e || !d) score -= n;
    score -= a*2;
    if (n >= 8 && e && d) score += 10;
    else score -= 5;
    cout << score << "\n";
}

Python code (credit: Amy Chou)

s = input()
length = len(s) #密碼字數
len_num = 0 #數字字元字數
len_en = 0 #英文字元字數
cnt = 0 #連續數字
isNum = False
for c in s:
    if c.isalpha():
        len_en += 1
        isNum = False
    else:
        len_num += 1
        if isNum:
            cnt += 1
        else:
            isNum = True

#密碼最低要求:
#1: 密碼最少包含8個字元
#2: 同時包含英文字元和數字字元
score = 0
if length >= 8 and len_num > 0 and len_en > 0:
    score += 10
else:
    score -= 5

score += length * 3 #密碼字數
score -= length * (len_num == 0) #只有英文字元
score -= length * (len_en == 0) #只有數字字元
score += len_en * 3 #英文字元
score += len_num * 2 #數字字元
score -= cnt * 2 #連續數字

print(score)
分享本文 Share with friends