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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351 > 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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351 > 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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022

11 sept. 2016 à 12:12
Ha bah faut suivre aussi ^^
Je t'ai répondu un peu plus haut :)
0
jordane45
Messages postés
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351
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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351 > 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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613 > jordane45
Messages postés
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351 > 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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351
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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022
351 > 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
36056
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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