const rl = require("readline").createInterface({
input: process.stdin,
output: process.stdout,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 判断ip是否合法
function ipValid(ip) {
// 可进一步优化
const reg = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
return reg.test(ip);
}
// 判断子网掩码是否合法
function checkSubnetMask(ip) {
let isValid = true;
let checkArr = ip.split(".");
let subnetStr = "";
checkArr.forEach((item) => {
// 将对应的ip转成2进制数据
subnetStr += (Number(item) + 256).toString(2).substring(1);
});
// 包含 01 的属于异常
if (subnetStr.indexOf("01") > -1) {
isValid = false;
} else if (subnetStr.indexOf("1") == -1 || subnetStr.indexOf("0") == -1) {
// 全为1或全为0 异常
isValid = false;
}
return isValid;
}
void (async function () {
let dataArr = [];
const ipObj = {
ipA: 0,
ipB: 0,
ipC: 0,
ipD: 0,
ipE: 0,
ipMaskErr: 0,
ipPrivate: 0,
};
while ((line = await readline())) {
// 循环获取数据
dataArr.shift();
dataArr.push(line.split("~"));
dataArr.forEach((item) => {
// item[0] -> ip item[1] -> mask
const first = Number(item[0].split(".")[0]);
const second = Number(item[0].split(".")[1]);
// 处理边界情况
if (first == 0 || first == 127) {
} else if (!checkSubnetMask(item[1]) || !ipValid(item[0])) {
ipObj.ipMaskErr++;
} else {
// 私网ip需要第二位
if (
first == 10 ||
(first == 172 && second <= 31 && second >= 16) ||
(first == 192 && second == 168)
) {
ipObj.ipPrivate++;
}
if (first <= 126 && first >= 1) {
ipObj.ipA++;
} else if (first <= 191 && first >= 128) {
ipObj.ipB++;
} else if (first <= 223 && first >= 192) {
ipObj.ipC++;
} else if (first <= 239 && first >= 224) {
ipObj.ipD++;
} else if (first <= 255 && first >= 240) {
ipObj.ipE++;
}
}
});
}
console.log(
ipObj.ipA +
" " +
ipObj.ipB +
" " +
ipObj.ipC +
" " +
ipObj.ipD +
" " +
ipObj.ipE +
" " +
ipObj.ipMaskErr +
" " +
ipObj.ipPrivate
);
})();