Fonction pour changer une chaine en équation

azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016 - 10 sept. 2016 à 13:05
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre 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 !

6 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
10 sept. 2016 à 13:50
Bonjour

Une regex?
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 15:42
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é...!
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
10 sept. 2016 à 16:34
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
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 18:15
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... :/
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 18:20
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.
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 18:54
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;
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 20:03
Bonjour
Commence par faire un echo de tes variables (surtout ton $equation[0] )
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
10 sept. 2016 à 21:28
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],"²","");
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
10 sept. 2016 à 22:02
Et "spliter" ton texte avec ² comme séparateur?
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
10 sept. 2016 à 23:14
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 ^^'
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
11 sept. 2016 à 00:30
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
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
11 sept. 2016 à 12:12
Ha bah faut suivre aussi ^^
Je t'ai répondu un peu plus haut :)
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
11 sept. 2016 à 02:18
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...


0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
11 sept. 2016 à 12:20
a, b et c représentent juste les nombres random. A chaque actualisation ils changent. Je peux par exemple obtenir sqrt(1)*3²+957 comme je peux obtenir sqrt(3)*4²+960 etc... voilà pourquoi je ne peux pas sélectionner b².
J'ai aussi testé sur une chaîne "normale" et j'arrive bien à remplacer ou à enlever le ².
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
11 sept. 2016 à 13:49
Oui et alors ?
Le code que je t'ai donné fonctionne dans tous ces cas. ..
Tu l'as testé au moins ???!!!
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
11 sept. 2016 à 17:53
Salut jordane, la regex a été ma première idée et sa réponse
Au vu de mon niveau actuel je dois admettre ne pas connaitre grand chose aux regex
laisse à penser qu'il n'a pas dû tester ton code....
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
11 sept. 2016 à 17:58
Oui oui, ça change absolument rien.
Ca retourne les mêmes valeurs que sans ta fonction...
Voilà le code :
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;
}

echo "<br />".$equation[0]." =>>".FormatstringPow($equation[0]);
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
11 sept. 2016 à 19:04
Je te le redemande pour la dernière fois : que contient EXACTEMENT $equation[0] ??
Tu m'as répondu dans une précédente réponse :

Mais sinon j'obtiens sqrt(a)*b²+c . sachant qu'a, b, et c sont des nombres random

Hors... si je prends cette chaine en entrée de ma fonction... j'obtiens :
sqrt(a)*b²+c  =>> sqrt(a)*pow(b,2)+c

Donc ça a bien été modifié.....
non ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
12 sept. 2016 à 16:04
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 ; */

0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
12 sept. 2016 à 16:53
.....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
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
12 sept. 2016 à 17:17
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 ^^
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016
12 sept. 2016 à 17:34
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 ??
0
azerty_vs_qwerty Messages postés 196 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 octobre 2016 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
12 sept. 2016 à 19:05
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.
0
Rejoignez-nous