|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
INTERPRETEUR BRAINFUCK
Information sur la source
Description
sur cette source, je vous presente trois interpreteurs brainfuck. le premier sans preprocessing le second, est plus rapide, il evite une boucle. le troisime est plus un compilateur brainfuck vers php.
Source
- <?php
-
- $stdin = fopen('php://stdin', 'r') or die ('erreur etrange');
- /**
- * @brief fonction d'entree
- * renvoie le caractere ascii du caractere suivant de stdin.
- * @return int
- */
- function prompt(){
- global $stdin;
- return ord(fread($stdin, 1));
- }
-
- /**
- * @brief fonction qui interprete un code brainfuck
- * solution sans preprocessing
- * @param $code le code a interpreter
- */
- function brainfuck_verbeux($code){
- $code_len = strlen($code);
- $mem = array();
- $indice_memoire = 0;
- for ($i=0;$i<$code_len;$i++){
- if (!isset($mem[$indice_memoire])) $mem[$indice_memoire]=0;
- else {
- // les valeurs sont comprises entre 0 et 256.
- $mem[$indice_memoire] = (256 + $mem[$indice_memoire] ) % 256;
- }
- switch($code[$i]){
- case '>': $indice_memoire++; break;
- case '<': $indice_memoire--; break;
- case '.': echo chr($mem[$indice_memoire]); break; // on affiche la valeur
- case ',': $mem[$indice_memoire]=prompt(); break;
- case '+': $mem[$indice_memoire]++; break; // on incremente la valeur
- case '-': $mem[$indice_memoire]--; break; // on decremente la valeur
- case ']':
- $n = 1; // on doit remonter $n [ en arriere
- while ($n){
- $i --; // on cherche en arriere
- if ($code[$i]==']') $n++; // si on rencontre un ], alors on attend un [ de plus
- else if ($code[$i]=='[') $n--; // si on trouve un [. alors on en attend un de moins
- } $i--; // on "jump" devant le [ correspondant.
- break;
- case '[':
- if ( $mem[$indice_memoire] == 0 ){
- $n = 1; // on doit monter $n ] en avant
- while ($n){
- $i ++;
- if ($code[$i]=='[') $n++; // si on rencontre un [, alors on attend un ] de plus
- else if ($code[$i]==']') $n--; // si on trouve un ]. alors on en attend un de moins
- } // ici, on a pas de $i-- parce-qu'on jump apres le ]
- } break;
- }
- }
- }
-
- /*
- la version ci dessus est une version legerement naive.
- On peut faire plus fin : eviter les boucles plus haut.
- Celles qui gerent les [ ].
- Pour les eviter, il faut resoudre les [] en preprocessing,
- pour cela, il nous suffit d'utiliser une pile.
-
- quand on croise un [, on l'empile, quand on croise un ],
- on depile et on a le couple.
- */
-
- /**
- * @brief fonction qui interprete un code brainfuck
- * solution avec preprocessing ( relier les [ aux ] )
- * @param $code le code a interpreter
- */
- function brainfuck($code){
- $code_len = strlen($code);
- // on gere les jumps ( [] )
- $jmp = array();
- $tmp = array();
- for ($i=0;$i<$code_len;$i++){
- if ($code[$i] == '[') array_push($tmp, $i);
- else if ($code[$i] == ']'){
- $start = array_pop($tmp);
- $jumps[$start] = $i;
- $jumps[$i] = $start - 1;
- }
- }
- // on interprete
- $mem = array();
- $indice_memoire = 0;
- for ($i=0;$i<$code_len;$i++){
- if (!isset($mem[$indice_memoire])) $mem[$indice_memoire]=0;
- else {
- // les valeurs sont comprises entre 0 et 256.
- $mem[$indice_memoire] = (256 + $mem[$indice_memoire] ) % 256;
- }
- switch($code[$i]){
- case '>': $indice_memoire++; break;
- case '<': $indice_memoire--; break;
- case '.': echo chr($mem[$indice_memoire]); break;
- case ',': $mem[$indice_memoire]=prompt(); break;
- case '+': $mem[$indice_memoire]++; break;
- case '-': $mem[$indice_memoire]--; break;
- case ']': $i = $jumps[$i]; break;
- case '[': if ( $mem[$indice_memoire] == 0 ) $i = $jumps[$i]; break;
- }
- }
- }
-
- function brainfuck_compilateur($str){
- $checktab='if(!isset($tab[$pos])) $tab[$pos]=0;';
- $replace = array(
- '+'=>'$tab[$pos] = ($tab[$pos]==255)?0:($tab[$pos]+1);',
- '-'=>'$tab[$pos] = ($tab[$pos]==0)?255:($tab[$pos]-1);',
- '>'=>'$pos++;'.$checktab,
- '<'=>'$pos--;'.$checktab,
- '['=>'while($tab[$pos]){',
- ']'=>'}',
- '.'=>'echo chr($tab[$pos]);',
- ','=>'$tab[$pos]=prompt();',
- );
- for ($i=0, $code='$tab = array(0); $pos = 0;', $len = strlen($str); $i<$len; $i++)
- if (isset($replace[$str[$i]]))
- $code.=$replace[$str[$i]]."\n";
- eval ($code);
- }
-
- brainfuck_verbeux(
- '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.');
- brainfuck_verbeux(',>,<+>+<.>.');
-
- ?>
<?php
$stdin = fopen('php://stdin', 'r') or die ('erreur etrange');
/**
* @brief fonction d'entree
* renvoie le caractere ascii du caractere suivant de stdin.
* @return int
*/
function prompt(){
global $stdin;
return ord(fread($stdin, 1));
}
/**
* @brief fonction qui interprete un code brainfuck
* solution sans preprocessing
* @param $code le code a interpreter
*/
function brainfuck_verbeux($code){
$code_len = strlen($code);
$mem = array();
$indice_memoire = 0;
for ($i=0;$i<$code_len;$i++){
if (!isset($mem[$indice_memoire])) $mem[$indice_memoire]=0;
else {
// les valeurs sont comprises entre 0 et 256.
$mem[$indice_memoire] = (256 + $mem[$indice_memoire] ) % 256;
}
switch($code[$i]){
case '>': $indice_memoire++; break;
case '<': $indice_memoire--; break;
case '.': echo chr($mem[$indice_memoire]); break; // on affiche la valeur
case ',': $mem[$indice_memoire]=prompt(); break;
case '+': $mem[$indice_memoire]++; break; // on incremente la valeur
case '-': $mem[$indice_memoire]--; break; // on decremente la valeur
case ']':
$n = 1; // on doit remonter $n [ en arriere
while ($n){
$i --; // on cherche en arriere
if ($code[$i]==']') $n++; // si on rencontre un ], alors on attend un [ de plus
else if ($code[$i]=='[') $n--; // si on trouve un [. alors on en attend un de moins
} $i--; // on "jump" devant le [ correspondant.
break;
case '[':
if ( $mem[$indice_memoire] == 0 ){
$n = 1; // on doit monter $n ] en avant
while ($n){
$i ++;
if ($code[$i]=='[') $n++; // si on rencontre un [, alors on attend un ] de plus
else if ($code[$i]==']') $n--; // si on trouve un ]. alors on en attend un de moins
} // ici, on a pas de $i-- parce-qu'on jump apres le ]
} break;
}
}
}
/*
la version ci dessus est une version legerement naive.
On peut faire plus fin : eviter les boucles plus haut.
Celles qui gerent les [ ].
Pour les eviter, il faut resoudre les [] en preprocessing,
pour cela, il nous suffit d'utiliser une pile.
quand on croise un [, on l'empile, quand on croise un ],
on depile et on a le couple.
*/
/**
* @brief fonction qui interprete un code brainfuck
* solution avec preprocessing ( relier les [ aux ] )
* @param $code le code a interpreter
*/
function brainfuck($code){
$code_len = strlen($code);
// on gere les jumps ( [] )
$jmp = array();
$tmp = array();
for ($i=0;$i<$code_len;$i++){
if ($code[$i] == '[') array_push($tmp, $i);
else if ($code[$i] == ']'){
$start = array_pop($tmp);
$jumps[$start] = $i;
$jumps[$i] = $start - 1;
}
}
// on interprete
$mem = array();
$indice_memoire = 0;
for ($i=0;$i<$code_len;$i++){
if (!isset($mem[$indice_memoire])) $mem[$indice_memoire]=0;
else {
// les valeurs sont comprises entre 0 et 256.
$mem[$indice_memoire] = (256 + $mem[$indice_memoire] ) % 256;
}
switch($code[$i]){
case '>': $indice_memoire++; break;
case '<': $indice_memoire--; break;
case '.': echo chr($mem[$indice_memoire]); break;
case ',': $mem[$indice_memoire]=prompt(); break;
case '+': $mem[$indice_memoire]++; break;
case '-': $mem[$indice_memoire]--; break;
case ']': $i = $jumps[$i]; break;
case '[': if ( $mem[$indice_memoire] == 0 ) $i = $jumps[$i]; break;
}
}
}
function brainfuck_compilateur($str){
$checktab='if(!isset($tab[$pos])) $tab[$pos]=0;';
$replace = array(
'+'=>'$tab[$pos] = ($tab[$pos]==255)?0:($tab[$pos]+1);',
'-'=>'$tab[$pos] = ($tab[$pos]==0)?255:($tab[$pos]-1);',
'>'=>'$pos++;'.$checktab,
'<'=>'$pos--;'.$checktab,
'['=>'while($tab[$pos]){',
']'=>'}',
'.'=>'echo chr($tab[$pos]);',
','=>'$tab[$pos]=prompt();',
);
for ($i=0, $code='$tab = array(0); $pos = 0;', $len = strlen($str); $i<$len; $i++)
if (isset($replace[$str[$i]]))
$code.=$replace[$str[$i]]."\n";
eval ($code);
}
brainfuck_verbeux(
'++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.');
brainfuck_verbeux(',>,<+>+<.>.');
?>
Conclusion
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 22 août 2008 06:26:45 :
- ajout de la troisieme fonction.
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
acces ressources web [ par elanspeech ]
Bonjour,J'ai mon site internet sur une machine.J'aimerais a partir d'une page de mon site pointer sur un fichier stocke sur une autre machine de mon r
valider une date saisie dans un champ avec la date de la machine [ par cba ]
cbaje rentre une date dans un champ d'un formulaireex on est le 05/04/03 (date machine)je saisis dans le formulaire la date 060403 ce champ correspon
tester la presence de machine sur un reseau [ par Elkaire ]
J'aimerais savoir comment faire pour detecter la présence d'une machine afin d'en obtenir un listing en vu de choisir sur laquelle je me connecte. J'a
Nom machine [ par Bruto ]
j'ai trouvé sur le site php.net la possibilité de récupéré le nom de la machine<?php$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']); print $hos
opendir et readdir sur la machine [ par mageonyme ]
Bonjour,Je voudrais que les utilisateurs de mon site puissent sélectionner un dossier qu'ils ont sur leur machine pour que l'ensemble du contenu soit
Problème avex ftp_put [ par Amine ]
Salut,J'ai installé sur ma machine le serveur web EasyPHp et j'ai creé une page php permettant de transferer u fichier depuis la machine client vers l
Php, sans Recharger site complet [ par 666BlackDragoon666 ]
Alors voila, j'ai cree un site en php , et mon probleme ces ke ken je clique sur un lien bah TOUT le site se recharge, au lieu de charger SEULEMENT la
Base MySql distante [ par Dark77 ]
Bonjour j'aurai besoin d'acceder a une base mysql distantePar acces j'entend ecrire et lire directemnt dedans exemple la machine 192.168.0.1 execute u
Lien sur machine distante (mapping et Cie) [ par skmancuso ]
Bonjour,J'exécute via l'intermédiaire de la commande system() un exécutable sur lequel je transmet 4 paramètres (un chemin d'acc&#
problème de planification [ par h_adil ]
bonjour, actuellement en stage, j'ai pour mission de mettre en place un planning de fabrication sous access. ce planning consiste a partir des donn
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|