题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

python3

刚开始忽略了题目中的说明,一直通过不了
说明:
类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时请忽略

import re
def is_right_ip(ip):
    if not ip:
        return False
    pattern = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
    mach = pattern.match(ip)
    if not mach:
        return False
    nums = ip.split('.')
    for num in nums:
        if int(num)<0 or int(num)>255:
            return False
    else:
        return True
def is_right_mask(mask):
    if not mask:
        return False
    if mask == '0.0.0.0' or mask =='255.255.255.255':
        return False
    else:
        m = ''.join(map(lambda x: bin(int(x))[2:].zfill(8),mask.split('.')))
        last_one = m.rfind('1')
        first_zero = m.find('0')
        if last_one > first_zero:
            return False
        else:
            return True
def is_personal_ip(ip):
    if not ip:
        return False
    else:
        nums = ip.split('.')
        if int(nums[0]) == 10:
            return True
        if int(nums[0]) == 172 and 16<=int(nums[1])<=31:
            return True
        if int(nums[0]) == 192 and int(nums[1])==168:
            return True
        else:
            return False
def is_type(ip):
    if not ip:
        return False
    else:
        nums = ip.split('.')
        if 1<=int(nums[0])<=126:
            return 'A'
        if 128<=int(nums[0])<=191:
            return 'B'
        if 192<=int(nums[0])<=223:
            return 'C'
        if 224<=int(nums[0])<=239:
            return 'D'
        if 240<=int(nums[0])<=255:
            return 'E'
A,B,C,D,E,EOR,P = 0,0,0,0,0,0,0
while True:
    try:

        ip,mask = input().split('~')
        if not is_right_ip(ip) or not is_right_mask(mask):
            nums = ip.split('.')
            if int(nums[0]) == 0 or int(nums[0]) == 127:
                continue
            else:
                EOR +=1
        else:
            if is_personal_ip(ip):
                P +=1
            if is_type(ip) == 'A':
                A+=1
            if is_type(ip) == 'B':
                B+=1    
            if is_type(ip) == 'C':
                C+=1
            if is_type(ip) == 'D':
                D+=1
            if is_type(ip) == 'E':
                E+=1
    except:
        break
print(f'{A} {B} {C} {D} {E} {EOR} {P}')


全部评论

相关推荐

老方子:英语等级cet写错了吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务