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 ); })();