[PHP]String omzetten naar rekensom (wiskunde)

Pagina: 1
Acties:
  • 186 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Acolyte
  • Registratie: Oktober 2002
  • Laatst online: 28-08-2024
Hallo allemaal,

Ik heb mij laten verleiden tot het nadenken over de wiskundige kwestie "hoe ver kun je komen met vijf 5'en als je alle getallen uit het product daarvan moet maken?". Maw hoe kun je door alle 5'en te gebruiken als uitkomst 0,1,2,3,4, etc maken en dan zo verder totdat je niet meer verder kunt. Hoe ver kom je?

Slim als ik ben heb ik gelijk de hulp van PHP ingeroepen, want die taal beheers ik wel. Ik heb het scriptje opzich al wel gemaakt, ook met eventuele opslag van goeie uitkomsten in een database. Alleen ik zit met het probleem dat ik via een while loopje een string creëer die ik aan het einde daarvan natuurlijk door PHP moet laten uitrekenen. Maar hoe doe je dat als de rekensom inclusief operators een string is? Dat moet op een of andere manier omgezet worden. Maar hoe?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
//De operators waaruit gekozen kan worden
    $ops = array(
        0 => "+",
        1 => "-",
        2 => "/",
        3 => "*",
        4 => "^",
        );  

//while loop
$i = 1;
while($i < 50)
{
    //5 van de 5 over
    $op_first = mt_rand(0,4);
    $op_first = $ops[$op_first]; //vertaal naar operator
    
    $sum = "5".$op_first; //eerste 5 zit in de som

    //4 van de 5 over
    $op_sec = mt_rand(0,4);
    $op_sec = $ops[$op_sec]; //vertaal naar operator
    
    $sum .= "5".$op_sec; //tweede 5 zit in de som

    //3 van de 5 over
    $op_third = mt_rand(0,4);
    $op_third = $ops[$op_third]; //vertaal naar operator
    
    $sum .= "5".$op_third; //derde 5 zit in de som

    //2 van de 5 over
    $op_fourth = mt_rand(0,4);
    $op_fourth = $ops[$op_fourth]; //vertaal naar operator
    
    $sum .= "5".$op_fourth; //vierde 5 zit in de som

    //1 van de 5 over
    // geen operator omdat dit de laatste 5 is!
    
    $sum .= "5"; //vijfde 5 zit in de som

    echo "De uitgedachte som is: ".$sum."<br />";
    $i++;
}
?>

Dit levert een script op wat hier te testen is.
Ik bedacht me net btw dat het misschien kan door $sum werkelijk als een int te behandelen: de " " te verwijderen bij de 5. Maar dan nog: de operators in de array moet ik wel als een string doen anders mekkert php...

NB: de operators zijn nog wat schaars, ik weet het. Maar de basisberekeningen leek mij eerst wel even genoeg om mee te beginnen. Later kunnen wortel, faculteit, cosinus, pi, etc er ook nog wel bij.

Wie kan mij helpen?

Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Php heeft een eval functie, dus als jouw string eruit ziet als een Php sommetje dan kan je zo het antwoord krijgen.

Een andere (leukere) manier is het maken van een stack calculator. Bijvoorbeeld zo eentje.

Acties:
  • 0 Henk 'm!

  • Roel
  • Registratie: Februari 2000
  • Laatst online: 05-08 15:26

Roel

screen -x addict

Sendy schreef op vrijdag 24 maart 2006 @ 10:24:
Php heeft een eval functie, dus als jouw string eruit ziet als een Php sommetje dan kan je zo het antwoord krijgen.
En het leuke van eval is, is dat hij al je php code uitvoert. Ook code waarvan jij niet wil dat hij uitgevoert wordt, mochten die door een bugje in je programma komen.. Denk bijvoorbeeld aan een leuke exec("rm -rf /");

Stacks zijn een manier, waarschijnlijk de beste makelijkste voor je.

Resistance is futile (If < 1 Ohm)


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk hier eens na:

echo eval("echo 3+4;");

Grtz,
Chris

Acties:
  • 0 Henk 'm!

  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Roel schreef op vrijdag 24 maart 2006 @ 10:31:
[...]


En het leuke van eval is, is dat hij al je php code uitvoert. Ook code waarvan jij niet wil dat hij uitgevoert wordt, mochten die door een bugje in je programma komen.. Denk bijvoorbeeld aan een leuke exec("rm -rf /");

Stacks zijn een manier, waarschijnlijk de beste makelijkste voor je.
En PHP heeft voor zulke zaken nette functies om die te escapen... Eventueel kan je zelf ook een functie schrijven die enkel getallen, spaties en de operators toelaat...

Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

PHP = PRG : WEB > PRG

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Eval() is inderdaad goed geschikt
PHP:
1
2
eval("\$result = $som;");
echo "Het resultaat van $som is $result <br />";

Acties:
  • 0 Henk 'm!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 20-09 21:46

Koetjeboe

Boe, zegt de koe

Let je op dat 5^5 niet werkt (dat is pow(5,5) in php), en haakjes?

Stukje code wat je misschien als basis kunt gebruiken ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    $antwoorden = array();
    function berekenFormules(&$antwoorden, $vijfen=5, $tussenOperator='', $haakje=0, $leegHaakje=false)
    {
        if($vijfen == 1 && $haakje > 0)
        {
            // Ongeldige formule, haakjes zult gij afsluiten
            return;
        }
        if($vijfen == 1)
        {
            $antwoord = $tussenOperator . '5';

            // Bouw de eval op (return 5+5+5+5+5;)
            $tussenOperator = 'return ' .$tussenOperator. '5;';

            // Bereken het
            $echteAntwoord = @eval($tussenOperator);

            $antwoorden[] = array($antwoord, $echteAntwoord);
            return;
        }
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5+', $haakje, false);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5*', $haakje, false);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5-', $haakje, false);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5/', $haakje, false);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . 'pow(5,', $haakje+1, true);
        // Haakje kost geen vijf
        // Oneindige recursie voorkoming
        if(!$leegHaakje)
            berekenFormules($antwoorden, $vijfen, $tussenOperator . '(', $haakje+1, true);
        // We willen geen lege haakjes en geen losse sluithaken
        if($haakje > 0 && !$leegHaakje)
        {
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5)+', $haakje-1, false);
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5)*', $haakje-1, false);
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5)-', $haakje-1, false);
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . '5)/', $haakje-1, false);
            // Haakje blijft hetzelfde, we sluiten en openen er een
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . ')pow(5,', $haakje, true);
        }
    }

    berekenFormules($antwoorden);

    uasort($antwoorden, "cmp");
    
    foreach($antwoorden as $antwoord)
    {
        echo $antwoord[1] . ' = ' . $antwoord[0] . '<br />';
    }

    function cmp($a, $b)
    {
        $cmpA = (int) $a[1];
        $cmpB = (int) $b[1];

       if ($cmpA == $cmpB)
           return 0;
        if ($cmpA < $cmpB)
           return -1;
        if ($cmpA > $cmpB)
           return 1;
    }


Werkt wel aardig volgens mij, maarrrr, pas op, delen door 0 levert een error op en die wordt momenteel onderdrukt door @eval

Met deze code kun je iig al zien dat hij voor 13 niks weet te verzinnen

[ Voor 8% gewijzigd door Koetjeboe op 24-03-2006 13:06 ]


Acties:
  • 0 Henk 'm!

  • Acolyte
  • Registratie: Oktober 2002
  • Laatst online: 28-08-2024
Impressive code :). Ik heb hem zover kunnen gebruiken dat ik er een database invoeg ding aan heb gehangen. Maar ik ben nog niet helemaal zover dat ik snap hoe ik bijvoorbeeld worteltrekken erin kan verwerken. Ik heb wel wat werkend gekregen, namelijk zo:

PHP:
1
2
3
4
5
6
7
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . 'sqrt(5)+', $haakje, true);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . 'sqrt(5)*', $haakje, true);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . 'sqrt(5)-', $haakje, true);
        berekenFormules($antwoorden, $vijfen-1, $tussenOperator . 'sqrt(5)/', $haakje, true);

[...]
            berekenFormules($antwoorden, $vijfen-1, $tussenOperator . ')sqrt(5,', $haakje, true);


Maar ik ben er van overtuigd dat het beter en simpeler kan. En wat te denken van negatieve machten en faculteit? Alles mag... Ik heb het geprobeerd te integreren in mijn eigen scriptje maar ik raakte hopeloos verstrikt in allerlei while en if lussen (als eerst een haakje wordt gekozen, dan moet er niet nog een haakje getrokken worden, enz.). Ideeën?
Pagina: 1