first commit
This commit is contained in:
commit
bde5b24c0d
3 changed files with 136 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
hints.txt
|
||||
logicalexpressions.txt
|
||||
.vscode/
|
20
index.html
Normal file
20
index.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<title>default</title>
|
||||
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="initial-scale=1, user-scalable=no, maximum-scale=1, width=device-width, height=device-height">
|
||||
|
||||
<script src="js/main.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
113
js/main.js
Normal file
113
js/main.js
Normal file
|
@ -0,0 +1,113 @@
|
|||
window.addEventListener("load", () => main());
|
||||
|
||||
const main = () => {
|
||||
|
||||
let def = {
|
||||
a: true,
|
||||
b: false,
|
||||
c: 5
|
||||
};
|
||||
|
||||
let exemple = "a && b || c"
|
||||
|
||||
console.log("with", def, "parsing logical expression of \"" + exemple + "\"");
|
||||
console.log("result : " + parseLogicalExpression(def, exemple));
|
||||
|
||||
console.log("\n\n-----\n\n ");
|
||||
console.log(parseLogicalExpression(def, "!a && b || c && a || c && b && a"));
|
||||
console.log("vrai rep d'apres JS:", !true && false || 5 && true || 5 && false && true);
|
||||
|
||||
console.log("\n\n-----\n\n ");
|
||||
console.log(parseLogicalExpression(def, "a || b || a && b && c || c"));
|
||||
console.log("vrai rep d'apres JS:", true || false || true && false && 5 || 5);
|
||||
|
||||
console.log("\n\n-----\n\n ");
|
||||
console.log(parseLogicalExpression(def, "a || a && !a && !b || !a"));
|
||||
console.log("vrai rep d'apres JS:", true || true && !true && !false || !true);
|
||||
|
||||
console.log("\n\n-----\n\n ");
|
||||
console.log(parseLogicalExpression(def, "(a || b) || (a && b) && c"));
|
||||
console.log("vrai rep d'apres JS:", true || false || true && false && 5 || 5);
|
||||
|
||||
};
|
||||
|
||||
const parseLogicalExpression = (subject = Object, expression = String) => {
|
||||
// on ajoute les portes non au subject
|
||||
Object.keys(subject).forEach(key => {
|
||||
subject["!" + key] = !subject[key];
|
||||
});
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
Explication regex pour pas oublier
|
||||
|
||||
( ... ) -> groupe
|
||||
| -> séparé les morceaux qu'on recherche
|
||||
[^)] -> récupérer le contenu entre ce qu'on a spécifié, ici ( et )
|
||||
+ -> au moins un élément
|
||||
---------------------------------------------------------------------- */
|
||||
|
||||
const splitter = (expression = String) => expression.split(/(&&|\|\||\([^)]+\))/).map(str => str.trim());
|
||||
|
||||
const replaceWithRightValues = (subject = Object, tableau = Array) => {
|
||||
let i = 0;
|
||||
tableau.forEach(expression => {
|
||||
Object.keys(subject).forEach(key => {
|
||||
if(key == expression) tableau[i] = subject[key];
|
||||
});
|
||||
i++;
|
||||
});
|
||||
}
|
||||
|
||||
const gate = (gate = String, array = Array) => {
|
||||
let posGate = array.findIndex(element => typeof element == "string")
|
||||
if(array[posGate] == gate) {
|
||||
// console.log("je vais travailler avec la porte", gate, "sur", array);
|
||||
// console.log("je fais,", array[posGate - 1], gate, array[posGate + 1])
|
||||
if(gate == "&&") array[posGate + 1] = array[posGate - 1] && array[posGate + 1];
|
||||
else if(gate == "||") array[posGate + 1] = array[posGate - 1] || array[posGate + 1];
|
||||
else return console.error("bad gate type");
|
||||
// console.log("res:", array[posGate + 1]);
|
||||
array.splice(posGate - 1, 2);
|
||||
// console.log("finit:", array);
|
||||
} // else console.warn("la porte", gate, "n'a pas la priorité de calcule", array);
|
||||
|
||||
// console.log("\n ");
|
||||
return array;
|
||||
};
|
||||
|
||||
const resolution = (problem = Array) => {
|
||||
while(problem.length > 1) ["&&", "||"].forEach(element => problem = gate(element, problem));
|
||||
};
|
||||
|
||||
// expression propre
|
||||
let arrayLogicalExpression = splitter(expression);
|
||||
console.log(arrayLogicalExpression);
|
||||
|
||||
// on remplace par les valeurs de subject
|
||||
replaceWithRightValues(subject, arrayLogicalExpression);
|
||||
|
||||
// on supprime les parenthèses
|
||||
// -> on retire les string vide
|
||||
arrayLogicalExpression = arrayLogicalExpression.filter(element => element != "");
|
||||
|
||||
// on calcule les parenthèses
|
||||
let calculatedBrackets = [] // inialisation du tableau qui va recevoir les réponses des parenthese
|
||||
arrayLogicalExpression.forEach(element => {
|
||||
if(typeof element == "string") { // ajout de tous les éléments sauf les parentheses
|
||||
if(element.startsWith("(") == 0 && element.endsWith(")") == 0) calculatedBrackets.push(element);
|
||||
} else calculatedBrackets.push(element)
|
||||
if(typeof element == "string") if(element.startsWith("(") && element.endsWith(")")) {
|
||||
element = splitter(element.replace("(", "").replace(")", ""));
|
||||
replaceWithRightValues(subject, element);
|
||||
resolution(element);
|
||||
calculatedBrackets.push(element[0]) // ajout des réponses aux parenthèses
|
||||
};
|
||||
});
|
||||
arrayLogicalExpression = calculatedBrackets;
|
||||
|
||||
// on résoud les problemes
|
||||
resolution(arrayLogicalExpression);
|
||||
|
||||
console.log(arrayLogicalExpression);
|
||||
return arrayLogicalExpression[0];
|
||||
};
|
Reference in a new issue