每行匹配了几个

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:net_02 的 to_int / mask、判「前缀是否包含地址」的 contains,和本机的路由表 ROUTES——每行 (前缀, 下一跳或 None 表示直连, 接口, 度量)。)

本机的路由表:

0.0.0.0/0        via 192.168.10.1   eth0  100   ← 默认
192.168.10.0/24  直连               eth0  100
10.0.0.0/8       via 192.168.10.254 eth0  100   ← 机房
10.20.0.0/16     via 192.168.10.253 eth0  100   ← 机房里更具体的一段
127.0.0.0/8      直连               lo    0

对同样五个地址,看每一行各「包含」几个(不管最后选没选它):

def to_int(ip):
    a, b, c, d = [int(x) for x in ip.split(".")]
    return (a << 24) | (b << 16) | (c << 8) | d


def mask(prefix):
    return (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF


def contains(cidr, ip):
    net, p = cidr.split("/")
    return to_int(net) & mask(int(p)) == to_int(ip) & mask(int(p))


ROUTES = [
    ("0.0.0.0/0", "192.168.10.1", "eth0", 100),
    ("192.168.10.0/24", None, "eth0", 100),
    ("10.0.0.0/8", "192.168.10.254", "eth0", 100),
    ("10.20.0.0/16", "192.168.10.253", "eth0", 100),
    ("127.0.0.0/8", None, "lo", 0),
]

ips = ("192.168.10.77", "10.20.5.5", "10.7.7.7", "8.8.8.8", "127.0.0.1")
print(",".join(str(sum(1 for ip in ips if contains(r[0], ip))) for r in ROUTES))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论