题目:
解析:
题目的意思就是,很清晰!!!! 直接上代码 代码中的注释很清晰
欢迎互相交流
代码产出:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 索引为2 3 4 5 6 7 8存放A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
var ignore = [0, 0, 0, 0, 0, 0, 0]
// 用来验证是否为一个合法的掩码,确保0后面没有1 逆向 只要0后面不是0,则!reg.test() 则是合法的掩码
var reg = /0[^0]/g
// 用来验证全为数字
var reg1 = /^[0-9]*$/
rl.on('line', function (line) {
fn(line)
});
// 设置定时器, 延时执行打印语句
setTimeout(() => {
console.log(ignore.join(' '))
}, 500)
var fn = (line) => {
var ip = line.split('~')[0]
var mask = line.split('~')[1]
var head = Number(ip.split('.')[0])
var next = Number(ip.split('.')[1])
// 当ip和掩码均为合法 计算地址类型
if (isip(ip) && isMask(mask)){
// 过滤【0.*.*.*】和【127.*.*.*】的IP地址 不计算
if (head !== 0 || head !== 127) {
if (head === 172 && next >= 16 && next <= 31 || head === 192 && next === 168 || head === 10)
ignore[6] ++
if (head >= 1 && head <= 126) {
// A地址
ignore[0]++
} else if (head >= 128 && head <= 191) {
// B地址
ignore[1]++
} else if (head >= 192 && head <= 223) {
// C地址
ignore[2]++
} else if (head >= 224 && head <= 239) {
// D地址
ignore[3]++
} else if (head >= 240 && head <= 255) {
// E地址
ignore[4]++
}
}
}
}
// 非法ip 当出现非数字,数字为负数 , 为空字符串
var isip = (ip) => {
if (ip.split('.').some(item => Number(item) < 0 || !reg1.test(item))) {
ignore[5]++
return false
}
return true
}
// 非法掩码
var isMask = (mask) => {
// 当出现非数字,数字为负数 , 为空字符串
if (mask.split('.').some(item => Number(item) < 0 || !reg1.test(item))){
ignore[5]++
return false
}
else if (mask === '0.0.0.0' || mask === '255.255.255.255') {// 当全部为0 或者 全部为1
ignore[5]++
return false
} else if(MaskZeroNoOne(mask.split('.')).match(reg)){// 0 后面出现 1 这里使用reg.test(MaskZeroNoOne(mask.split('.')))不通过???
ignore[5]++
return false
} else {
return true
}
}
// 确保是一个64位的字符串
var MaskZeroNoOne = (arr) => {
var str = ''
for (let i=0;i<arr.length;i++) {
if (parseInt(arr[i]).toString(2).length < 8) {
str += addZero(parseInt(arr[i]).toString(2))
} else {
str += parseInt(arr[i]).toString(2)
}
}
return str
}
// 掩码的二进制不够8位数自动补充
var addZero = (str) => {
return '0'.repeat(8 - str.length) + str
}