千万!不要!尝试写合法子网掩码的生成式!老老实实一个一个写左移!查生成式BUG查了半小时!
import sys
code_list = [
0b0,
0b1 << 7,
0b11 << 6,
0b111 << 5,
0b1111 << 4,
0b11111 << 3,
0b111111 << 2,
0b1111111 << 1,
]
def check_ip_and_code(s): # 返回None或(所属分类、是否私有)
result = [0, False]
ip, code = s.split("~")
ip = ip.split(".")
code = code.split(".")
# 0: 判断不计入统计类别
if ip[0] == "0" or ip[0] == "127":
return None
# 1: 判断掩码是否合法
need_zero = False # 出现非255的结果后,要求全是0
for each in code:
if not each: # 如果each为空,表示非法
return 5, False
tmp = int(each)
if need_zero: # 如果要求全是0,则非0结果返回False
if tmp != 0:
return 5, False
else:
if tmp == 255: # 首位为1的情况下,255直接执行下一步
continue
elif tmp in code_list: # 如果不是255,说明到分界点了,后续需要全是0
need_zero = True
else:
return 5, False
# 特殊处理,全为1和全为0的子网掩码也是非法
if code[0] == code[1] == code[2] == code[3]:
return 5, False
# 2: 解析IP
ip_list = []
for each in ip:
if not each:
return 5, False # 如果each为空,表示非法
ip_list.append(int(each))
# 3: 判断IP类别
if 1 <= ip_list[0] <= 127:
result[0] = 0 # "A"
elif 128 <= ip_list[0] <= 191:
result[0] = 1 # "B"
elif 192 <= ip_list[0] <= 223:
result[0] = 2 # "C"
elif 224 <= ip_list[0] <= 239:
result[0] = 3 # "D"
elif 240 <= ip_list[0] <= 255:
result[0] = 4 # "E"
# 4: 判断是否私有
if ip_list[0] == 10 \
or (ip_list[0] == 172 and 16 <= ip_list[1] <= 31) \
or (ip_list[0] == 192 and ip_list[1] == 168):
result[1] = True
return result
result_list = [0] * 7
for line in sys.stdin:
a = line.strip()
result = check_ip_and_code(a)
if result is None:
continue
result_list[result[0]] += 1
if result[1]:
result_list[6] += 1
print(" ".join(map(str, result_list)))



京公网安备 11010502036488号