#Tips:
#十进制数据转二进制:bin(a),a为十进制数,返回值为带有0b前缀的二进制数字字符串
#int函数做字符串转数字时参数不能为空
#有时候在Try...except...结构中,代码出错他不会给你抛出,debug时需要注意
#思路:
#先特判是否不计数;
#非不计数ip则再判断子网掩码是否正确,因为如果掩码不对直接就是错误ip了,不需要判断abcde和私有ip;
#如果掩码正确则独立判断abcde和私网IP
#检查ip函数1
def checkip1(ip):
a=ip.split(".")
for i in range(len(a)):
if len(a[i])==0:#避免为空时直接使用int导致程序出错而退出Try
return "W"
else:
a[i]=int(a[i])
#判断ABCDE类
if 1<=a[0]<=126 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255:
return "A"
elif 128<=a[0]<=191 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255:
return "B"
elif 192<=a[0]<=223 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255:
return "C"
elif 224<=a[0]<=239 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255:
return "D"
elif 240<=a[0]<=255 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255:
return "E"
else:
return "W"
#检查ip函数2
def checkip2(ip):
a=ip.split(".")
for i in range(len(a)):
if len(a[i])==0:
return False
else:
a[i]=int(a[i])
#判断私有ip
p1= a[0]==10 and 0<=a[1]<=255 and 0<=a[2]<=255 and 0<=a[3]<=255
p2= a[0]==172 and 16<=a[1]<=31 and 0<=a[2]<=255 and 0<=a[3]<=255
p3= a[0]==192 and a[1]==168 and 0<=a[2]<=255 and 0<=a[3]<=255
if p1 or p2 or p3:
return True
#检查子网掩码函数
def checksub(sub):
a=sub.split(".")
#转数字之后转二进制
for i in range(len(a)):
if len(a[i])==0:
return False
else:
a[i]=int(a[i])
a[i]=bin(a[i])[2:]
a[i]="0"*(8-len(a[i]))+a[i]#对有些不足8位的部分补全
b="".join(a)
#判断子网掩码是不是前面全1后面全0
#思路:特判+使用“10”分割,判断前面是全1并且后面是全0
if len(b)==b.count("1") or len(b)==b.count("0"):#特判全1或者全0
return False
elif b[0]=="1" and len(b[1:])==b.count("0"):#特判只有开头一个1
return True
elif b[-1]=="0" and len(b[:-1])==b.count("1"):#特判只有末尾一个0
return True
else:
b1=b.split("10")#切割开之后的列表
b2=b1[0]#前半部分
b3=b1[1]#后半部分
if len(b1)==2 and len(b2)==b2.count("1") and len(b3)==b3.count("0"):
return True
else:
return False
Al=Bl=Cl=Dl=El=Wr=Pr=0#初始化各数量
while True:
try:
a=input().split("~")
ip=a[0]
sub=a[1]
#特判不计数ip
if ip[0]=="0" or ip[0:3]=="127":
continue
else:
#判断子网掩码
if checksub(sub):
#先判断私网IP
if checkip2(ip):
Pr+=1
#再判断是否为ABCDE类ip或错误ip
if checkip1(ip)=="A":
Al+=1
elif checkip1(ip)=="B":
Bl+=1
elif checkip1(ip)=="C":
Cl+=1
elif checkip1(ip)=="D":
Dl+=1
elif checkip1(ip)=="E":
El+=1
elif checkip1(ip)=="W":
Wr+=1
else:
Wr+=1
except:
print(Al,Bl,Cl,Dl,El,Wr,Pr)
break