Fonction pour changer une chaine en équation

Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
- - Dernière réponse : azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
- 12 sept. 2016 à 19:05
Bonjour,
Dans le cadre d'un challenge informatique, je dois faire en sorte qu'une équation soit calculée puis que le résultat soit envoyé dans un délais imparti. l'équation étant présentée sous la forme : racine(a)*b²+c est l'équation à calculer
Voilà donc ce que je crois qu'il faut faire :
$str_equation= file_get_contents('le fichier',,);
$equation= str_replace ( 'racine',"sqrt",explode (' ', $str_equation));
$rep= eval $equation[0];
header('Location:blablabla'.$rep)

Le blem c'est qu'il y a un "²" dans l'équation et comme c'est toujours une équation random, Je ne peux pas faire de str_replace pour remplacer a² en
pow(a, 2); Hélas la fonction eval ne considère pas "²"... Et il ne faut pas oublier la limite de temps (1s). Si vous pouviez m'indiquer vers quelles fonctions me tourner (juste des indications. Il ne faut pas oublier que ça reste un challenge...) ou s'il y a possibilité de voir le problème sous un autre angle, je suis preneur !
Afficher la suite 

Votre réponse

6 réponses

Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Bonjour

Une regex?
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Au vu de mon niveau actuel je dois admettre ne pas connaitre grand chose aux regex, étant en train de suivre un cours en ligne, je n'ai pas encore lu le chapitre les concernant ^^. Je cherche donc plus côté fonctions pour l'instant. Mais si vous confirmez qu'il n'est possible de faire cette tâche qu'en exécutant une regex, je vous en serais garant car ce serait du temps gagné...!
Whismeril
Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
-
Non ça n'est sans doute pas le seul moyen.
Une recherche sur la position du caractère puis "recule" dans le texte tant qu'on trouve des chiffres devrait fonctionner
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Ca a l'air faisable, sauf que tout ça doit être traité en moins d'une seconde, ce qui enlève déjà déjà pas mal de possibilités... :/
Commenter la réponse de Whismeril
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
0
Merci
Je tente un truc.
J'ai remarqué que b est toujours compris entre 1 et10. Je n'ai qu'à
ne pas prendre en compte le ² et espérer qu'à un moment b = 1...
ça rentre dans la catégorie des "bruteforces pas très intelligents" mais pour le moment, c'est tout ce que je peux faire ^^.
Je laisse le topic ouvert pour d'éventuelles suggestions.
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
lol... ² n'est traité ni par str_replace ni par strtr... Je ne peux donc pas le changer. Je ne sais pas si ça vient de mon code mais je commence à en devenir zinzin :
$equation= str_replace ( 'racine',"sqrt",explode (' ', $str_equation));

//J'ai aussi essayé avec str_replace
$equ= strtr ($equation[0],"²","0");

/*La valeur retournée est la même que quand je n'ai pas appliqué
la dernière ligne de code*/
echo $equ;
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Bonjour
Commence par faire un echo de tes variables (surtout ton $equation[0] )
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
C'est ce que je fais pour chaque commande.
Mais sinon j'obtiens sqrt(a)*b²+c . sachant qu'a, b, et c sont des nombres random. Je cherche à rendre b² en pow(b, 2) sauf que si je fais ça, Le programme devient beaucoup trop lent pour valider à temps... j'ai donc cherché à enlever le "²", sauf que ça le fait juste pas :/.
Il y a aussi une erreur dans mon précédent code. A la ligne 4 :
$equ= strtr ($equation[0],"²","");
Commenter la réponse de azerty_vs_qwerty
Messages postés
12392
Date d'inscription
mardi 11 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Et "spliter" ton texte avec ² comme séparateur?
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Non plus. Ca affiche la même que sans séparateur, voici le code :

$equation= str_replace ( 'racine',"sqrt",explode (' ', $str_equation));

echo ($equation[0].'<br />');

$split_carre= explode ('²',$equation[0]);

echo $split_carre[0];

Je me demande si mon code ne considère pas $equation[0] comme une constante ou une connerie du genre... Peut-être que j'aurais dû me renseigner sur les regex au final ^^'
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
La question que je me pose... c'est : QUE T'AFFICHE LE ECHO de $equation[0] ??
Il faut qu'on le sache pour pouvoir avancer
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Ha bah faut suivre aussi ^^
Je t'ai répondu un peu plus haut :)
Commenter la réponse de Whismeril
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
au passage, voici une regexp qui devrait te permettre de trouver rapidement les chaines à trasnformer en pow...

(\w²|\([\w+\-\*\/]*\)²)


Ce qui donne :
<?php
//affichage des erreurs php
error_reporting(E_ALL);

function toPow($matches){
  $strSans2 = str_replace("²","",$matches[0]);
  return "pow($strSans2,2)";
}
function FormatstringPow($str){
    $pattern = "(\w²|\([\w+\-\*\/]*\)²)";
    $sortie = preg_replace_callback($pattern,"toPow", $str);
  return  $sortie;
}

$test1 = "sqrt(a)*b²+c";
echo "<br>".$test1." =>>".FormatstringPow($test1);
 
 $test2 = "sqrt(a)*(b+z-x/2)²+c";
 echo "<br>".$test2." =>>".FormatstringPow($test2);



Comme tu peux le voir...ça fonctionne quelque soit la chaine à modifier. Une seule lettre (ou un seul chiffre) ou toute une expression...


jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Et pour le résultat évalué:
$test1 = "sqrt(9)*3²+10 ";
echo "<br>".$test1." =>>".FormatstringPow(trim($test1));
echo "<br> =".eval('return '.FormatstringPow(trim($test1)).';');

ça donne :

sqrt(9)*3²+10 =>>sqrt(9)*pow(3,2)+10
=37


et avec cet exemple la :
$test1 = "sqrt(9)*(5*2)²+10 ";
echo "<br>".$test1." =>>".FormatstringPow(trim($test1));
echo "<br> =".eval('return '.FormatstringPow(trim($test1)).';');

donne :

sqrt(9)*(5*2)²+10 =>>sqrt(9)*pow((5*2),2)+10
=310


Edit : En faisant l'exemple suivant :
$test1 = "sqrt(9)*(5*2)²+10² ";
echo "<br>".$test1." =>>".FormatstringPow(trim($test1));
echo "<br> =".eval('return '.FormatstringPow(trim($test1)).';');
 

Je me suis rendu compte d'une petite erreur....
Si ce ne sont bien que des nombres/chiffres que tu utilises en lieu et place des lettres.... l'expression régulière à utiliser est donc :
 $pattern = "(\d{1,}²|\([\d{1,}+\-\*\/]*\)²)";

et ça donne bien :

sqrt(9)*(5*2)²+10² =>>sqrt(9)*pow((5*2),2)+pow(10,2)
=400
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Bingo ! Tu viens juste de comprendre le problème ^^. Encore faut-il trouver comment le résoudre :)
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Ben ça y est. .. ça marche non ?
Que te faut-il de plus ?
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Justement... Ca ne marche pas. C'est ce que j'essaye de te dire depuis le début !!
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Ben ... je ne sais pas comment tu fais ... car les exemples que je t'ai donné... c'est en faisant fonctionner le script chez moi !!!

Donc... commence par nous montrer ton code dans son intégralité et après on verra où tu as raté !
Commenter la réponse de jordane45
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
0
Merci
Ca marche. Par contre il y a deux ou trois trucs que je vais censurer avec des *** pour des raisons plus qu'évidentes...
Donc :
<?php

//Pour le PHPSESSID.

$session= stream_context_create(array("http" => array ("header" => "Cookie: ***")));

//récupère la phrase : racine(nbRandom1)*nbRandom2²+nbRandom3 est l'équation à résoudre

$str_equation= file_get_contents('https://www.****.org/epreuves/prog/prog4.php',false,$session);

//remplace le mot racine par sqrt et prélève l'équation

$equation= str_replace ( 'racine','sqrt',explode (' ', $str_equation));

//La fonction que tu m'as demandé d'utiliser

function toPow($matches){
 
 $strSans2 = str_replace("²","",$matches[0]);
 
 return "pow($strSans2,2)";

}

function FormatstringPow($str){

    $pattern = "(\d{1,}²|\([\d{1,}+\-\*\/]*\)²)";

    $sortie = preg_replace_callback($pattern,"toPow", $str);

  return  $sortie;

}

//le test avec la fonction

echo "<br />".$equation[0]." =>>".FormatstringPow($equation[0]);

//Et voici deux autres fonctions que j'ai eu le loisir de tester :

/*echo ($equation[0].'<br />');

$split_carre= explode ('²',$equation[0]);

echo $split_carre[0];*/

/* $equ= str_replace ('²','',$equation[0]);

echo $equ ; */

Commenter la réponse de azerty_vs_qwerty
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
.....arrrrrgggghhhhhhhh.....
En même temps... si tu ne prends qu'une partie du code forcément...ça marche moins bien !!!!!

Donc :
Voici le résultat obtenu :

str_equation : racine(5)*1²+336 est l'équation à calculer.
equation : Array ( [0] => sqrt(5)*1²+336 [1] => est [2] => l'équation [3] => à [4] => calculer. )
equation[0] : sqrt(5)*1²+336

Resultat
sqrt(5)*pow(1,2)+336

Avec le code suivant :
<?php
//La fonction que tu m'as demandé d'utiliser
function toPow($matches){
  $strSans2 = str_replace("²","",$matches[0]);
  return "pow($strSans2,2)";
}
function FormatstringPow($str){
    $pattern = "(\d{1,}²|\([\d{1,}+\-\*\/]*\)²)";
    $sortie = preg_replace_callback($pattern,"toPow", $str);
  return  $sortie;
}


//$url = "https://www.newbiecontest.org/epreuves/prog/prog4.php";
//$str_equation= file_get_contents($url,false,$session);
$str_equation = "racine(5)*1²+336 est l'équation à calculer.";
echo "<br>str_equation : ";
print_r($str_equation);
//remplace le mot racine par sqrt et prélève l'équation

$equation= str_replace ( 'racine','sqrt',explode (' ', $str_equation));
echo "<br>equation : ";
print_r($equation);


echo "<br>equation[0] : ";
print_r($equation[0]);

echo "<br><br>Resultat <br> ";
echo FormatstringPow($equation[0]);


Je te laisse remettre la connexion au site https://www.newbiecontest.org
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Nope. J'obtiens :
str_equation : racine(1)*8²+505 est l'équation à calculer.
equation : Array ( [0] => sqrt(1)*8²+505 [1] => est [2] => l'équation [3] => à [4] => calculer. )
equation[0] : sqrt(1)*8²+505

Resultat
sqrt(1)*8²+505

Par contre quels sont les changements que tu as appliqué et ou as tu vu d'erreurs dans mon code ? Ca m'intéresse ^^
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
-
Où j'ai vu des erreurs ????? ben... là où tu n'as pas mis la TOTALITE du code par exemple.....

J'espère que cette fois tu as été capable de faire un copier/coller du code que je t'ai donné ....(en totalité ! ) !!!

Bon.. et juste pour être sûr.... ton fichier php (celui qui contient ton script).. il est bien en UTF8 sans BOM hein ??
azerty_vs_qwerty
Messages postés
208
Date d'inscription
mercredi 14 janvier 2015
Dernière intervention
2 octobre 2016
> jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Je ne pense pas que ça ait un rapport avec le copier collé vu que même ce script ne fonctionne pas... Mais sinon j'utilise UTF8. J'ai testé sans BOM mais ça ne marche pas non plus.

J'ai cependant remarqué quelque chose d'intéressant :
ça fonctionne bien si $str_equation est une chaîne de caractères définie. càd quand j'écris moi même la valeur. Par contre si je fais file_get_contents, c'est là que ta fonction ne s'applique plus. C'est peut-être une piste.
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.