HJ20 密码验证程序
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK
注:输入结束后有中止结束标志EOF【这个原题给的时候无说明,自己跑他的用例和看论坛看出来的】
-
题解:
要点有三个,分别是:长度超过八位、包含三种以上、和公共子字符串,以及输入输出
- 输入输出:以为如果知道了他有EOF终止输入的话,可以使用
sys.stdin.read
或者使用while
+try
的方式,我是用的后者,方便调试。 - 长度超过八位就不解释了
- 至少三种以上:遍历每个字符,如果出现了大、小写、数字、字符、那么出现的情况就记为1,无则0.最后统计满足情况
- 公共子序列:
- 遍历密码获得长度为3的子序列【如果不存在则append,否则直接退出】(因为不能大于2,就是最少是3个)
- 输入输出:以为如果知道了他有EOF终止输入的话,可以使用
-
难度:
- 如果题目告诉了有EOF的情况下挺简单,没解释清楚有EOF我也不会获取不定长输入
-
code:
""" 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000OK NG NG OK """ dig,low,up,pun = 0,1,2,3 OK = "OK" NotOk = "NG" import stringdef judge_whether_lawful(input_str:str)->str:strs = [one_char for one_char in input_str]ok_count_list = [0,0,0,0] #4 situationok_count = 0if len(strs) < 8:return NotOkfor idx in range(len(strs)):if strs[idx] in string.digits:ok_count_list[dig] = 1elif strs[idx] in string.ascii_lowercase:ok_count_list[low] = 1elif strs[idx] in string.ascii_uppercase:ok_count_list[up] = 1elif strs[idx] in string.punctuation:ok_count_list[pun] = 1ok_count = sum(ok_count_list)public_list = []for idx in range(2,len(strs)):get_public = input_str[idx-2:idx] + input_str[idx]if get_public in public_list:return NotOkelse:public_list.append(input_str[idx-2:idx]+input_str[idx])if ok_count >= 3:return OKelse:return NotOkif __name__ == '__main__':input_list = []while True:try:temp_input = input()print(judge_whether_lawful(temp_input))except:break