// 分成ip和掩码
// 判断ip时候合法 掩码是否合法
// 判读私有ip
// 判断A B C D E
// 注意边界条件 0 127
const rl = require("readline").createInterface({
input: process.stdin,
output: process.stdout,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const ipValidTest = (ip) => {
return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(ip);
};
const isPrivateIp = (ip) => {
const arr = ip.split(".").map((item) => Number(item));
const first = arr[0];
const second = arr[1];
if (
first == 10 ||
(first == 172 && second <= 31 && second >= 16) ||
(first == 192 && second == 168)
) {
return true;
}
return false;
};
const isValidMask = (ip) => {
let isValid = true;
let str = "";
const arr = ip.split(".").map((item) => Number(item));
arr.forEach((item) => {
// 转成二进制形式,255对应的数字有8位,保证8位
str += item.toString(2).padStart(8,0);
});
if (str.indexOf("01") !== -1) {
isValid = false;
} else if (str.indexOf("0") == -1 || str.indexOf("1") == -1) {
isValid = false;
}
return isValid;
};
void (async function () {
const targetObj = {
ipA: 0,
ipB: 0,
ipC: 0,
ipD: 0,
ipE: 0,
ipMaskErr: 0,
ipPrivate: 0,
};
while ((line = await readline())) {
const [ip, mask] = line.split("~");
const ipArr = ip.split('.')
// 考虑边界条件 0 127忽略不计
if(ipArr[0] == '0' || ipArr[0] == '127'){
}else if (!ipValidTest(ip) || !isValidMask(mask)) {
targetObj.ipMaskErr++;
} else {
if (isPrivateIp(ip)) {
targetObj.ipPrivate++;
}
const leftArr = ip.split(".").map((item) => Number(item));
const first = leftArr[0];
if (first >= 1 && first <= 126) {
targetObj.ipA++;
} else if (first >= 28 && first <= 191) {
targetObj.ipB++;
} else if (first >= 192 && first <= 223) {
targetObj.ipC++;
} else if (first >= 224 && first <= 239) {
targetObj.ipD++;
} else if (first >= 240 && first <= 255) {
targetObj.ipE++;
}
}
}
console.log(
targetObj.ipA +
" " +
targetObj.ipB +
" " +
targetObj.ipC +
" " +
targetObj.ipD +
" " +
targetObj.ipE +
" " +
targetObj.ipMaskErr +
" " +
targetObj.ipPrivate +
" "
);
})();