Interpréteur de BrainFuck
par
Skreo,
le 8 Juillet 2007 à 02:09 (modifié le 08/07/2007 à 04:45)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
Laisser un commentaire
Tags : brainfuck
Suivre le flux RSS des commentaires de cet article
Revenir à la liste des articles
Haut de page
Merci de me répondre le plus vite possible !