密码要求:1.长度超过8位;2.包括大小写字母.数字.其它符号,以上四种至少三种;3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行) 数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100 输入描述:一组字符串。 输出描述:如果符合要求输出:OK,否则输出NG 输入: 021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000 输出: OK NG NG OK
# 1/whileTrue,inputstr-def
# 2/len-return
# 3/az-AZ-09,其他符号,cnt
# 4/大于2个公共子串,每次取3个从i开始取3个,i+3=len则结束
def exam(instr):
ins = instr
# print(ins)
num = [str(i) for i in range(10)]
low = [chr(i) for i in range(97,123)]
big = [chr(i).upper() for i in range(97,123)]
nbl = num + low + big
# print(nbl)
# 长度小于等于8则直接NG
if len(ins) <= 8:
return 'NG'
# 包含大小写即数字,则set有1个类型的即可,和low-big-num进行求集合不等于时则统计+1
s = set(ins)
cnt = 0
if len(s - set(num)) != len(s):
# print(s - set(num))
cnt += 1
if len(s - set(low)) != len(s):
cnt += 1
if len(s - set(big)) != len(s):
cnt += 1
# print(s - set(nbl))
# 021$bc9000 剩余 $ 符号 长度不为0则cnt+1
if len(s - set(nbl)) != 0:
cnt += 1
#for i in s:
# if i not in nbl:
# cnt += 1
# # print(i,'===')
# break
# print(cnt)
if cnt < 3:
return 'NG'
# print('okk')
three = []
for i in range(len(ins)):
# print(ins[i:i+3])
# 0CD-NG 取3个字符后直接分裂求长度,循环到倒数第三位时停止循环
# if len(ins) - 3 >= i:
if len(ins) - 3 >= i and len(ins.split(ins[i:i+3])) >= 3:
# three.append(ins[i:i+3])
return 'NG'
else:
# if不存在时候,则继续执行下一条
continue
# 每次取至少大于2即为3个字符来判断,4个字符包含3个,没必要判断4个
# 公共子串看样例要求是连续的,才有重复2遍的说法
# 则取最后3个字符作为连续子串时候,即i=8时就break,if到7执行完毕后结束
# break
# print(three)
# ['021', '21A', '1Ab', 'Abc', 'bc9', 'c90', '900', '000']
# ['021', '21A', '1Ab', 'Abc', 'bc9', 'c9A', '9Ab', 'Abc', 'bc1']
#for i in three:
# # 对每个子串,分裂出超过2份,则包含重复子串
# if len(ins.split(i)) > 2:
# return 'NG'
return 'OK'
while True:
try:
instr = input().strip()
res = exam(instr=instr)
print(res)
except:
break