Accueil > > > INTERPRETEUR BRAINFUCK
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
branifuck powaaa
Historique
- 22 août 2008 06:26:45 :
- ajout de la troisieme fonction.
Sources du même auteur
Sources de la même categorie
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
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|