# 判断子网掩码是否正确
def check_mask(l_mask):
if l_mask.count("255") == 4 or l_mask.count("0") == 4: # 二进制下全是1或者全是0均为非法子网掩码
return False
# 子网掩码为二进制下前面是连续的1,然后全是0
s = ""
for i in l_mask:
t = bin(int(i))[2:].zfill(8)
s += t
# print(s)
index_0 = s.index("0")
if len((s[:index_0])) != s[:index_0].count("1"):
return False
if len((s[index_0:])) != s[index_0:].count("0"):
return False
return True
# 判断ip地址是否正确
def check_ip(l_ip):
if "" in l_ip: # ip地址里面不能有空地址
return False
if len((l_ip)) != 4: # ip地址的长度必须是4
return False
for i in l_ip:
if int(i) < 0 or int(i) > 255: # ip地址里面的每一项数字范围必须是1~255
return False
return True # 如果以上3种情况都没有出现,就说明它是一个合法的ip地址
# 判断是否是ABCDE类地址
def check_type(l_ip):
num = int(l_ip[0])
if 1 <= num and num <= 126:
return "A"
if 128 <= num and num <= 191:
return "B"
if 192 <= num and num <= 223:
return "C"
if 224 <= num and num <= 239:
return "D"
if 240 <= num and num <= 255:
return "E"
# 判断私有
def check_private(l_ip):
num0 = int(ip[0])
num1 = int(ip[1])
if num0 == 10:
return True
if num0 == 172:
if 16 < num1 and num1 < 31:
return True
if num0 == 192 and num1 == 168:
return True
return False
d = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "ERROR": 0, "PRIVATE": 0}
while True:
try:
ip, mask = input().split("~")
ip = ip.split(".")
mask = mask.split(".")
# print(ip,mask)
if (
ip[0] == "0" or ip[0] == "127"
): # 1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略
continue
if check_ip(ip) and check_mask(mask):
if check_private(ip):
d["PRIVATE"] += 1
if check_type(ip):
d[check_type(ip)] += 1
else:
d["ERROR"] += 1
except:
break
for i in d.values():
print(i, end=" ")