Godefroy de Compreignac

Blog de Skreo :: Webdev && Hi-Tech 

  • Connexion
  • Inscription
  • Créer mon blog
  • Index
    • Accueil
    • Contact
    • Rubriques
    • Hi-Tech & Linux
    • Web development
    • Java
    • Flash
    • Maths & Algorithmes
    • Divers
  • Qui suis-je...

    Godefroy de Compreignac, aka Skreo. Je suis actuellement étudiant en prépa PSI à l'ISEP. Passionné d'informatique et plus particulièrement de programmation web depuis 2001, mes principaux sites web sont Murties et EklaBlog. Ce blog est un support pour partager mes astuces, idées, coups de coeurs...
    Vous pouvez me retrouver sur Twitter, et Facebook.

    Flux RSS S'abonner par RSS

    150000 readers on FakeBurner

  • Recherche

  • Twitter
    • Chargement
  • Criteo
    http://widget.criteo.com/
    autoroll
    bi=2136307726
  • MyBlogLog
  • Derniers visiteurs
    SkreoStockholm
    M13yseult-la-blonde
    leongRemV
  • Sites amis
    • EklaWeb - Création de sites web
    • Créer un blog gratuitement
    • Jeux gratuit en ligne
    • Blogroll
    • Clément Delafargue
    • Payda
    • Darklg
    • Symbolique des Fleurs
    • Xipoons
  • Tag Cloud
    eee pc pgp divarvel geekchic php test bac classe hier hecatombe eklablog xml usb skreo soiree reflechir firefox serveur javascript vacances asus p535 programmation cle bibliotheque css blog gmail photos fla site

    Voir tous les tags
Reporter un abus
  • Maths & Algorithmes

    Interpréteur de BrainFuck

    par Skreo, le 8 Juillet 2007 à 02:09
    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.murties.com/skreo/perso/perso/brainfuck.php.txt

    Partager cet article : Wikio Twitter del.icio.us Facebook Digg Technorati Yahoo! Stumbleupon Google Blogmarks Ask Slashdot
    Tags Tags : brainfuck
    Suivre le flux RSS des commentaires de cet article
    Revenir à la liste des articles

    Haut de page

  • Commentaires

    1
    sterrix Profil de sterrix
    24 Octobre 2007 à 14:09
    sterrix
    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
    Skreo Profil de Skreo
    24 Octobre 2007 à 19:23
    Skreo
    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
    sterrix Profil de sterrix
    24 Octobre 2007 à 20:03
    sterrix
    A oui désolé...


    Ajouter un commentaire
    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :


    Recopiez le code inscrit sur l'image :


    Ce code est un code de sécurité pour empêcher le spam en vérifiant que la personne qui poste est bien un humain et non un robot.

    Haut de page

Godefroy de Compreignac - EklaBlog - Créer un blog gratuit Un site EklaWeb - CGU - Blogs Murties.com - Murties.com
Actions
  • Aller à l'accueil
  • Contact
  • Chercher un article
Connexion Créer mon blog Créer mon compte EklaBlog - Créer un blog gratuit
Vous avez reçu un nouveau message !