题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import sys
res = [0] * 7
for line in sys.stdin:
ip, mac = line.strip().split('~')
ip = ip.split('.')
mac = mac.split('.')
if ip[0] == '0' or ip[0] == '127':
continue
if len(ip) < 4 or len(mac) < 4:
res[5] += 1
continue
is_ip_wrong = False
for sub in ip:
if not sub.isnumeric():
res[5] += 1
is_ip_wrong = True
break
if int(sub) < 0 or int(sub) > 255:
res[5] += 1
is_ip_wrong = True
break
if is_ip_wrong:
continue
is_mac_wrong = False
if mac[0] == '0' or mac[3] == '255':
is_mac_wrong = True
res[5] += 1
continue
for i in range(4):
if is_mac_wrong:
break
if mac[i] == '0':
if i < 3:
if mac[i + 1] != '0':
is_mac_wrong = True
res[5] += 1
break
continue
if not mac[i].isnumeric():
res[5] += 1
is_mac_wrong = True
break
if 0 < int(mac[i]) < 128:
res[5] += 1
is_mac_wrong = True
break
temp = int(mac[i])
# 判断二进制形式是否为连续的1
for j in range(7, -1, -1):
if is_mac_wrong:
break
temp -= 2**j
if temp < 0:
is_mac_wrong = True
res[5] += 1
break
elif temp == 0:
if i != 3 and j > 0:
# 不是255但是是其他二进制是连续的1的数,那么mac中剩余的数必须都是0才是合法的mac
if mac[i+1:].count('0') != 4 - i - 1:
is_mac_wrong = True
res[5] += 1
break
break
if is_mac_wrong:
continue
# 判断是否为私有 ip
if ip[0] == '10':
res[6] += 1
elif ip[0] == '172' and 16 <= int(ip[1]) <= 31:
res[6] += 1
elif ip[0] == '192' and ip[1] == '168':
res[6] += 1
if 1 <= int(ip[0]) <= 126:
res[0] += 1
elif 128 <= int(ip[0]) <= 191:
res[1] += 1
elif 192 <= int(ip[0]) <= 223:
res[2] += 1
elif 224 <= int(ip[0]) <= 239:
res[3] += 1
else:
res[4] += 1
for i in res:
print(i, end=' ')
