// 分成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 + " " ); })();