题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
def IpRead(ip:str) -> list:
i = ip.split('.')
if '' in i:
return []
else:
i = list(map(int, i))
for num in i:
if num > 255 or num < 0:
return []
return i
def MaskLegalCheck(mask:list) -> bool:
if mask == [255,255,255,255] or mask == [0,0,0,0]: # 二进制下全是1或者全是0
return False
binary = ''.join([format(c, '08b') for c in mask])
if '01' in binary:
return False
return True
def IpCatagorized(ip:list) -> str:
if 1 <= ip[0] <= 126:
return 'A'
elif 128 <= ip[0] <= 191:
return 'B'
elif 192 <= ip[0] <= 223:
return 'C'
elif 224 <= ip[0] <= 239:
return 'D'
elif 240 <= ip[0] <= 255:
return 'E'
else:
return 'Invalid'
def IpPrivateCheck(ip:list) -> bool:
if any([
ip[0] == 10,
ip[0] == 172 and 16 <= ip[1] <= 31,
ip[0] == 192 and ip[1] == 168
]):
return True
else:
return False
ip_cata = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0}
illegal = 0
private = 0
while True:
try:
ip, mask = input().split('~')
ip, mask = IpRead(ip), IpRead(mask)
if IpCatagorized(ip) == 'Invalid':
continue
if any([
ip == [], mask == [], # 错误格式IpRead()函数会返回空列表
not MaskLegalCheck(mask) # 非法类型
]):
illegal += 1
continue
else:
ip_cata[IpCatagorized(ip)] += 1 # 分类
if IpPrivateCheck(ip): # 私有
private += 1
except:
break
print(*ip_cata.values(), illegal, private)

