• Interpréteur de BrainFuck

    Dans ma lutte perpétuelle contre le travail utile, je viens de gaspiller 2 heures à coder un interpréteur de BrainFuck en PHP.
    Pour ceux qui ne connaissent pas le BrainFuck : http://fr.wikipedia.org/wiki/Brainfuck
    Vous allez me dire, "Hey mais ça existe déjà t'es trop nul !", oué c'est vrai, mais celui-ci est beaucoup plus rapide que les autres car il compile le BrainFuck en PHP et exécute le PHP obtenu avec eval. Et pour les ptits emmerdeurs qui me diront que la fonction eval n'est pas sécuritaire, je leur répondrai que oui mais non parce que là on gère que des chaînes de caractères, celui qui arrive à me hacker ça je lui offre un pikachu en peluche.
    Je préviens, c'est totalement inutile, mais ça peut être intéressant (ça peut...).

    Voici la seule fonction de l'interpréteur :
    <?php
     
     function brainfuck($code, $input=''){
         $code = preg_replace('#[^\[\]\+\-\.,<>]#', '', $code); // On supprime tous les caractères non reconnus par le BF
         $code = str_replace(']', '}', $code);
         $code = str_replace('[', 'while($t[$p]!="\x00"){', $code);
         $code = preg_replace('#([\+]+)#e', '\'$t[$p] = chr(ord($t[$p])+\'.strlen("\\1").\');\'', $code);
         $code = preg_replace('#([\-]+)#e', '\'$t[$p] = chr(ord($t[$p])-\'.strlen("\\1").\');\'', $code);
         $code = preg_replace('#([>]+)#e', '\'$p += \'.strlen("\\1").\';\'', $code);
         $code = preg_replace('#([<]+)#e', '\'$p -= \'.strlen("\\1").\';\'', $code);
         $code = str_replace('.', '$o .= $t[$p];', $code);
         $code = str_replace(',', '$t[$p] = $i[$pi++];', $code);
         $code = '$p = 0;'.                                             // Pointeur
                 '$t = str_pad(\'\', 30000, chr(0));'.                // Tableau d'octets
                 '$i = \''.str_replace('\'', '\\\'', $input).'\';'.    // Input
                 '$pi = 0;'.                                            // Pointeur de l'input
                 '$o = \'\';'.                                        // Output
                 $code.
                 'return $o;';
        
         $o = @eval($code);
         return $o ? $o : '';
     }
     ?>
    [code=php]
    <?php

    function brainfuck($code, $input=''){
        $code = preg_replace('#[^\[\]\+\-\.,<>]#', '', $code); // On supprime tous les caractères non reconnus par le BF
        $code = str_replace(']', '}', $code);
        $code = str_replace('[', 'while($t[$p]!="\x00"){', $code);
        $code = preg_replace('#([\+]+)#e', '\'$t[$p] = chr(ord($t[$p])+\'.strlen("\\1").\');\'', $code);
        $code = preg_replace('#([\-]+)#e', '\'$t[$p] = chr(ord($t[$p])-\'.strlen("\\1").\');\'', $code);
        $code = preg_replace('#([>]+)#e', '\'$p += \'.strlen("\\1").\';\'', $code);
        $code = preg_replace('#([<]+)#e', '\'$p -= \'.strlen("\\1").\';\'', $code);
        $code = str_replace('.', '$o .= $t[$p];', $code);
        $code = str_replace(',', '$t[$p] = $i[$pi++];', $code);
        $code = '$p = 0;'.                                             // Pointeur
                '$t = str_pad(\'\', 30000, chr(0));'.                // Tableau d'octets
                '$i = \''.str_replace('\'', '\\\'', $input).'\';'.    // Input
                '$pi = 0;'.                                            // Pointeur de l'input
                '$o = \'\';'.                                        // Output
                $code.
                'return $o;';
       
        $o = @eval($code);
        return $o ? $o : '';
    }
    ?>
    [/code]


    Et voici un exemple d'utilisation :
    <?php
     echo brainfuck('-[>+>++>++<<<-----]+++[>++++++<-]>.>+++++.+.>-----.<<---.>.+++.--------.');
     ?>
    [code=php]
    <?php
    echo brainfuck('-[>+>++>++<<<-----]+++[>++++++<-]>.>+++++.+.>-----.<<---.>.+++.--------.');
    ?>
    [/code]


    Dîtes-moi le résultat que ça vous donne :p (Pas toi divarvel !)
    Vous pouvez aussi tester la fonction avec des codes en BF que vous trouverez sur internet, à priori tout marche ;-)
    Si vous avez trop la flemme de recopier ce code dans votre éditeur (bande de fainéants !), voici un fichier php avec le code de la fonction et des exemples :
    http://data0.eklablog.com/skreo/perso/perso/brainfuck.php.txt

    Tags Tags :
  • Commentaires

    1
    Mercredi 24 Octobre 2007 à 14:09
    C'est en quel language ça ? Parce que moi j'ai DevC++, donc j'utilise le C et le C++ et si ton truc c'est du Java... ça ira pas.
    Merci de me répondre le plus vite possible !
    2
    Mercredi 24 Octobre 2007 à 19:23
    Il me semble que j'ai précisé au moins 3 fois dans mon article que c'est du PHP...
    Si tu ne connais pas le PHP : http://fr.wikipedia.org/wiki/PHP:_Hypertext_Preprocessor
    3
    Mercredi 24 Octobre 2007 à 20:03
    A oui désolé...
    4
    Smyt
    Mercredi 7 Janvier 2009 à 22:10
    Et dire que je connais à peines mes tables de multiplications ... Alala j'ai honte
    Suivre le flux RSS des commentaires de cet article


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :