119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
/*
|
|
You are attempting to solve a Coding Contract. You have 10 tries remaining, after which the contract will self-destruct.
|
|
|
|
Given the following string containing only digits, return an array with all possible valid IP address combinations that can be created from the string:
|
|
|
|
Note that an octet cannot begin with a '0' unless the number itself is exactly '0'. For example, '192.168.010.1' is not a valid IP.
|
|
|
|
Examples:
|
|
|
|
25525511135 -> ["255.255.11.135", "255.255.111.35"]
|
|
1938718066 -> ["193.87.180.66"]
|
|
*/
|
|
|
|
/** @param {NS} ns */
|
|
function isValidIP(ip) {
|
|
var octets = ip.split(".");
|
|
if(octets.length != 4) return false;
|
|
|
|
for(var i = 0; i < octets.length; i++) {
|
|
var length = octets[i].length;
|
|
var value = parseInt(octets[i]);
|
|
if(length == 0 || length > 3 || octets[i].charAt(0) == '0' || value > 255 || value < 0) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/** @param {NS} ns */
|
|
function isValidOctet(octet) {
|
|
if(octet.length <= 0 || octet.length > 3) return false;
|
|
|
|
var octetValue = parseInt(octet);
|
|
if(octetValue > 255 || octetValue < 0) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
function generateOctet(ips, octets, input, sliceRange) {
|
|
var octets1 = [...octets, input.slice(0, sliceRange)];
|
|
if(isValidOctet(octets1[octets1.length - 1])) {
|
|
generateIPAddress(ips, octets1, input.slice(sliceRange, input.length));
|
|
}
|
|
}
|
|
|
|
function generateIPAddress(ips, octets, input) {
|
|
if(input.length == 0) {
|
|
var ip = octets.join(".");
|
|
if(isValidIP(ip)) {
|
|
if(ips.indexOf(ip) == -1) {
|
|
ips.push(ip);
|
|
return ips;
|
|
}
|
|
}
|
|
} else {
|
|
generateOctet(ips, octets, input, 3);
|
|
generateOctet(ips, octets, input, 2);
|
|
generateOctet(ips, octets, input, 1);
|
|
}
|
|
|
|
return ips;
|
|
}
|
|
|
|
/** @param {NS} ns */
|
|
function test(ns, ips, expected) {
|
|
if(ips.length != expected.length) {
|
|
ns.tprint("test: generated and expected lengths differ!");
|
|
return false;
|
|
}
|
|
|
|
for(var i = 0; i < ips.length; i++) {
|
|
if(ips[i] != expected[i]) {
|
|
ns.tprint(ips[i] + " != " + expected[i]);
|
|
ns.tprint("test: values differ!");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/** @param {NS} ns */
|
|
function testClient(ns) {
|
|
var testInput1 = "25525511135";
|
|
var testExpected1 = ["255.255.11.135", "255.255.111.35"];
|
|
var testInput2 = "1938718066";
|
|
var testExpected2 = ["193.87.180.66"];
|
|
var testResult1 = generateIPAddress(ns, [], [], testInput1);
|
|
var testResult2 = generateIPAddress(ns, [], [], testInput2);
|
|
|
|
ns.tprint("Result 1: " + testResult1);
|
|
ns.tprint("Result 2: " + testResult2);
|
|
|
|
ns.tprint(test(ns, testResult1.reverse(), testExpected1));
|
|
ns.tprint(test(ns, testResult2.reverse(), testExpected2));
|
|
}
|
|
|
|
export function generateIPAddresses(input) {
|
|
return generateIPAddress([], [], input.toString())
|
|
}
|
|
|
|
/** @param {NS} ns */
|
|
export async function main(ns) {
|
|
if(ns.args.length > 0) {
|
|
var arg = ns.args[0];
|
|
if(arg == "--test" || arg == "-t") {
|
|
testClient(ns);
|
|
} else if(ns.args.length == 2 && (arg == "--print" || arg == "-p")) {
|
|
var input = ns.args[1].toString();
|
|
ns.tprint(generateIPAddress([], [], input));
|
|
} else {
|
|
var input = arg.toString();
|
|
return generateIPAddress([], [], input)
|
|
}
|
|
} else {
|
|
ns.tprint("Usage error: Require an input to generate IP addresses or the --test|-t flag.");
|
|
}
|
|
} |