<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<script type="text/javascript">
var evaluate={
'+':(a,b)=>a+b,
'-':(a,b)=>a-b,
'*':(a,b)=>a*b,
'/':(a,b)=>{b==0?null:a/b}
}
var operators = Object.keys(evaluate);
//does not touch hand
function go(hand, handSize, goal){
if(handSize ==1){
if(hand[0].v == goal){
console.log('GOAL '+hand[0].toString());
}
return;
}
for(var i = 0; i<hand.length; ++i){
for(var j = i+1; j<hand.length; ++j){
var t = hand.slice(0);
var a = t.splice(i,1)[0];
var b = t.splice(j-1,1)[0];
operators.forEach(op=>{
var v = evaluate[op](a.v,b.v);
if(v!=null){
t[handSize-2] = new Tree(a,b,op,v);
go(t, handSize-1, goal);
}
})
}
}
}
function Tree(a,b,op,v){
this.a = a;
this.b = b;
this.op = op;
this.v = v;
}
Tree.prototype.toString = function(){
var strongNoPar = function(x){
return x.leaf()?x.v:'('+x.toString()+')';
}
var noPar = function(x){
return x.leaf()?x.v:
x.multiplicative()?x.toString():'('+x.toString()+')';
}
if(this.leaf()){
return this.v;
}
if(this.op == '+'){
return this.a.toString()+this.op+this.b.toString();
}
if(this.op == '-'){
return this.a.toString()+this.op+noPar(this.b);
}
return noPar(this.a)+this.op+strongNoPar(this.b);
}
Tree.prototype.leaf = function(){
return !this.a;
}
Tree.prototype.multiplicative = function(){
if(this.leaf()){return true;}
return (this.op=='*' || this.op=='/') && this.a.multiplicative() && this.b.multiplicative();
}
function process(f){//'2+3*5-(1+6*50)'
var goal = eval(f);
var numbers = f.replace(/[()]/g,'').split(/[-+*/]/).map(x=>new Tree(null,null,null,parseFloat(x.trim(), 10)));
var bef = Date.now();
go(numbers, numbers.length, goal)
console.log('goal was '+ goal+ ', elapsed '+ Math.floor(Date.now()-bef)+' ms')
}
window.onload = function(){
var junk = document.getElementById('junk');
console.log(document.getElementsByTagName('form')[0])
document.getElementsByTagName('form')[0].onsubmit = function(e){
e.preventDefault();
try{
var tmp = console.log;
console.log = function(s){
junk.innerHTML += s+'<br/>';
}
process(this.formula.value);
console.log = tmp;
}catch(e){console.log('moron'+e);}
return false;
}
}
</script>
</head>
<body>
<form action="#">
<input type="text" name="formula" value="1+3*(5-1)"/>
<input type="submit"/>
</form>
<hr/>
<div id="junk"></div>
</body>
</html>
Je subodore que lorsque ça matche, il faut faire une levée de doute avec des valeurs différentes.
Ou un bon résultat ne peut-il venir que d'une bonne formule ?
J'ai le projet de faire un logiciel qui d'une formule quelconque à quatre signes et parenthèses, donnera toutes les égalitésBen314 a écrit:Par exemple, si au départ x=a-a, tu fait comment pour "faire passer le a à gauche du égal" ?
Et si x=a*a*a*a*a+a+1, tu fait comment pour "faire passer a de l'autre coté" ?
Valentin03 a écrit:A partir de : x=a+b*(c-a) . . .
pendant que a, b et c prennent tour à tour la place de x
Il faudra (de nouveau) que tu m'explique la signification de l'expression "prendre la place de" vu que, perso, partant de x=a-a, j'aurais pas vraiment dit que a pouvait "prendre la place" de quoi que ce soit...Valentin03 a écrit:a-a =...; a est bien passé à gauche
J'attends avec une grand impatience que fatal_error règle ce "petit détail" (*)Valentin03 a écrit:Pour: x=a*a*a*a*a+a+1 je ne suis pas assez calé, mais si fatal_error s'en occupe il va bien te sortir a f(x)
Oui, c'est vrai que fatal-error, qui lui a tout lu pas en diagonale du tout, ça donne tout à fait l'impression que, dans ces posts précédents, il a répondu a la question posé dans ton post du 01 Nov 2016 15:07Valentin03 a écrit:Ben, si tu lis en diagonale, c'est normal que tu comprenne de travers (sans vouloir t'offenser)
J'attends avec une grand impatience que fatal_error règle ce "petit détail" (*)
J'attends avec une grand impatience que fatal_error règle ce "petit détail" (*)C'est pas con comme méthode : avec ce point de vue concernant ce qu'est un "passage à gauche", on doit effectivement y arriver assez souvent.fatal_error a écrit:compte tenu du fait que a-a=x, a est bien passé à gauche,
a*a*a*a*a+a = x-1, a est également bien passé à gauche!
Mon objectif était (un peu) de diminuer le temps de calcul
)Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 93 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :