mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-10 09:43:54 +01:00
Partially implemented solver for 2-coloring contract
Implemented the case for the 2-coloring solver to validate that entered colorings are proper. Still needs a case for when no solution exists. Also, changed the data from type [number, number][] to [number, [number, number][]], so that the number of vertices in the graph can be the first parameter.
This commit is contained in:
parent
a97f864e14
commit
bdfd102085
@ -1310,10 +1310,10 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
|||||||
name: "Proper 2-Coloring of a Graph",
|
name: "Proper 2-Coloring of a Graph",
|
||||||
difficulty: 6,
|
difficulty: 6,
|
||||||
numTries: 5,
|
numTries: 5,
|
||||||
desc: (data: [number, number][]): string => {
|
desc: (data: [number, [number, number][]]): string => {
|
||||||
return `test description, submit "${JSON.stringify(data)}"`;
|
return `test description: "${JSON.stringify(data)}"`;
|
||||||
},
|
},
|
||||||
gen: (): [number, number][] => {
|
gen: (): [number, [number, number][]] => {
|
||||||
//Generate two partite sets
|
//Generate two partite sets
|
||||||
const n = Math.floor(Math.random() * 5) + 3;
|
const n = Math.floor(Math.random() * 5) + 3;
|
||||||
const m = Math.floor(Math.random() * 5) + 3;
|
const m = Math.floor(Math.random() * 5) + 3;
|
||||||
@ -1331,7 +1331,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
|||||||
//Add an edge at random with no regard to partite sets
|
//Add an edge at random with no regard to partite sets
|
||||||
let a = Math.floor(Math.random() * (n + m));
|
let a = Math.floor(Math.random() * (n + m));
|
||||||
let b = Math.floor(Math.random() * (n + m));
|
let b = Math.floor(Math.random() * (n + m));
|
||||||
if (a > b) [a, b] = [b, a]; //Enforce a <= b
|
if (a > b) [a, b] = [b, a]; //Enforce lower numbers come first
|
||||||
if (a != b && !edges.includes([a, b])) {
|
if (a != b && !edges.includes([a, b])) {
|
||||||
edges.push([a, b]);
|
edges.push([a, b]);
|
||||||
}
|
}
|
||||||
@ -1346,15 +1346,44 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
|||||||
//Replace instances of the original vertex names in-place
|
//Replace instances of the original vertex names in-place
|
||||||
for (let i = 0; i < edges.length; i++) {
|
for (let i = 0; i < edges.length; i++) {
|
||||||
edges[i] = [shuffler[edges[i][0]], shuffler[edges[i][1]]];
|
edges[i] = [shuffler[edges[i][0]], shuffler[edges[i][1]]];
|
||||||
|
if (edges[i][0] > edges[i][1]) {
|
||||||
|
//Enforce lower numbers come first
|
||||||
|
[edges[i][0], edges[i][1]] = [edges[i][1], edges[i][0]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return edges;
|
return [n + m, edges];
|
||||||
},
|
},
|
||||||
solver: (data: [number, number][], ans: string): boolean => {
|
solver: (data: [number, [number, number][]], ans: string): boolean => {
|
||||||
//TODO: Return false for invalid inputs.
|
//No solution case
|
||||||
//TODO: Check the no solution case.
|
if (ans == "[]") {
|
||||||
//TODO: Check if the given 2-coloring is proper.
|
//TODO: Check if there is no solution
|
||||||
return JSON.stringify(data) == ans;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sanitize player input
|
||||||
|
const sanitizedPlayerAns: string = removeBracketsFromArrayString(ans);
|
||||||
|
const sanitizedPlayerAnsArr: string[] = sanitizedPlayerAns.split(",");
|
||||||
|
const coloring: number[] = sanitizedPlayerAnsArr.map((val) => parseInt(val));
|
||||||
|
|
||||||
|
//Solution provided case
|
||||||
|
if (coloring.length == data[0]) {
|
||||||
|
const edges = data[1];
|
||||||
|
const validColors = [0, 1];
|
||||||
|
//Check that the provided solution is a proper 2-coloring
|
||||||
|
return edges.every(([a, b]) => {
|
||||||
|
const aColor = coloring[a];
|
||||||
|
const bColor = coloring[b];
|
||||||
|
return (
|
||||||
|
validColors.includes(aColor) && //Enforce the first endpoint is color 0 or 1
|
||||||
|
validColors.includes(bColor) && //Enforce the second endpoint is color 0 or 1
|
||||||
|
aColor != bColor //Enforce the endpoints are different colors
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//Return false if the coloring is the wrong size
|
||||||
|
else return false;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
Loading…
Reference in New Issue
Block a user