千万!不要!尝试写合法子网掩码的生成式!老老实实一个一个写左移!查生成式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)))