题解 | #识别有效的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)

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务