Accueil > > > INTERPRETEUR BRAINFUCK
INTERPRETEUR BRAINFUCK
Information sur la source
Description
certains m'ont dit que le mysql n'etait pas un langage de programmation, mais seulement un langage de description de requetes, d'interrogations de db, etc.... ils ont alors ajoute que le caractere turing complete etait caracteristique d'un langage de programmation (ce qui n'est pas totalement vrai....) voici donc un interpreteur brainfuck en mysql. le code suivant prouve que mysql est turing complete. pour lancer la source, lancez mysql en console, selectionnez une database, puis copiez la source.
Source
- delimiter |
-
- CREATE DATABASE `test`;|
- USE `test`;|
-
- DROP FUNCTION IF EXISTS CHARAT;|
- CREATE FUNCTION CHARAT(str TEXT, i INT) RETURNS CHAR
- BEGIN
- RETURN SUBSTRING(str,i,1);
- END;|
-
-
- DROP TABLE IF EXISTS `memory`;|
- CREATE TABLE IF NOT EXISTS `memory`( `indice` INT, `valeur` INT);|
-
- DROP FUNCTION IF EXISTS GETMEM;|
- CREATE FUNCTION GETMEM(i INT) RETURNS INT NOT DETERMINISTIC
- BEGIN
- DECLARE r INT;
- SET r = (SELECT valeur FROM `memory` WHERE `indice` = i);
- IF r IS NULL THEN
- RETURN 0;
- END IF;
- RETURN r;
- END;|
-
-
- DROP PROCEDURE IF EXISTS SETMEM;|
- CREATE PROCEDURE SETMEM(i INT, v INT) NOT DETERMINISTIC
- BEGIN
- DELETE FROM `memory` WHERE `indice` = i;
- INSERT INTO `memory`(`indice`, `valeur`) VALUES (i, v mod 256);
- END;|
- /*
- CALL SETMEM(1, 12);|
- SELECT GETMEM(0), GETMEM(1);|
- */
- DROP TABLE IF EXISTS `jmp`;|
- CREATE TABLE `jmp`(`indice_code` INT, `indice_jmp` INT);|
-
- /* parsing des jmp */
- DROP PROCEDURE IF EXISTS PARSECODE;|
- CREATE PROCEDURE PARSECODE ( code TEXT )
- BEGIN
- DECLARE i_code, len_code, tmp INT;
- DECLARE char_code CHAR;
- DELETE FROM `jmp`;
- SET i_code = 0;
- SET len_code = LENGTH(code);
- REPEAT
- SET char_code = CHARAT(code, i_code);
- IF char_code = '[' THEN
- INSERT INTO `jmp` (`indice_code`) VALUES (i_code);
- ELSE
- IF char_code = ']' THEN
- SET tmp = (SELECT `indice_code` FROM `jmp` WHERE `indice_jmp` IS NULL ORDER BY `indice_code` DESC LIMIT 1) ;
- UPDATE `jmp` SET `indice_jmp` = i_code WHERE `indice_code` = tmp;
- END IF;
- END IF;
- SET i_code = i_code + 1;
- UNTIL i_code > len_code END REPEAT;
- END;|
- /*
- CALL PARSECODE("[ [ ] [ ] ]");|
- SELECT * FROM `jmp`;|
- */
- DROP FUNCTION IF EXISTS bf;|
- CREATE FUNCTION bf ( code TEXT, input TEXT) RETURNS TEXT
- BEGIN
- DECLARE i_code, len_code INT;
- DECLARE char_code CHAR;
- DECLARE stdout TEXT;
- DECLARE i_input INT;
- DECLARE i_memory INT;
- DECLARE i_stack INT;
- DECLARE tmp INT;
- CALL PARSECODE(code);
- DELETE FROM `memory`;
- SET i_code = 0;
- SET i_stack = 0;
- SET len_code = LENGTH(code);
- SET stdout = "";
- SET i_memory = 0;
- SET i_input = 0;
- REPEAT
- SET char_code = CHARAT(code, i_code);
- CASE char_code
- WHEN '.' THEN
- SET stdout = CONCAT(stdout, CHAR(GETMEM(i_memory) ));
- WHEN ',' THEN
- BEGIN
- CALL SETMEM(i_memory, CHARAT(input, i_input));
- SET i_input = i_input + 1;
- END;
- WHEN '>' THEN
- SET i_memory = i_memory + 1;
- WHEN '<' THEN
- SET i_memory = i_memory - 1;
- WHEN '+' THEN
- CALL SETMEM(i_memory, GETMEM(i_memory) + 1);
- WHEN '-' THEN
- CALL SETMEM(i_memory, GETMEM(i_memory) - 1);
- WHEN '[' THEN
- BEGIN
- IF GETMEM(i_memory) = 0 THEN
- SET i_code = (SELECT `indice_jmp` FROM `jmp` WHERE `indice_code` = i_code);
- END IF;
- END;
- WHEN ']' THEN
- BEGIN
- SET i_code = (SELECT `indice_code` FROM `jmp` WHERE `indice_jmp` = i_code);
- SET i_code = i_code - 1;
- END;
- ELSE
- BEGIN
- END;
- END CASE;
- SET i_code = i_code + 1;
- UNTIL i_code > len_code END REPEAT;
- RETURN stdout;
- END;|
delimiter |
CREATE DATABASE `test`;|
USE `test`;|
DROP FUNCTION IF EXISTS CHARAT;|
CREATE FUNCTION CHARAT(str TEXT, i INT) RETURNS CHAR
BEGIN
RETURN SUBSTRING(str,i,1);
END;|
DROP TABLE IF EXISTS `memory`;|
CREATE TABLE IF NOT EXISTS `memory`( `indice` INT, `valeur` INT);|
DROP FUNCTION IF EXISTS GETMEM;|
CREATE FUNCTION GETMEM(i INT) RETURNS INT NOT DETERMINISTIC
BEGIN
DECLARE r INT;
SET r = (SELECT valeur FROM `memory` WHERE `indice` = i);
IF r IS NULL THEN
RETURN 0;
END IF;
RETURN r;
END;|
DROP PROCEDURE IF EXISTS SETMEM;|
CREATE PROCEDURE SETMEM(i INT, v INT) NOT DETERMINISTIC
BEGIN
DELETE FROM `memory` WHERE `indice` = i;
INSERT INTO `memory`(`indice`, `valeur`) VALUES (i, v mod 256);
END;|
/*
CALL SETMEM(1, 12);|
SELECT GETMEM(0), GETMEM(1);|
*/
DROP TABLE IF EXISTS `jmp`;|
CREATE TABLE `jmp`(`indice_code` INT, `indice_jmp` INT);|
/* parsing des jmp */
DROP PROCEDURE IF EXISTS PARSECODE;|
CREATE PROCEDURE PARSECODE ( code TEXT )
BEGIN
DECLARE i_code, len_code, tmp INT;
DECLARE char_code CHAR;
DELETE FROM `jmp`;
SET i_code = 0;
SET len_code = LENGTH(code);
REPEAT
SET char_code = CHARAT(code, i_code);
IF char_code = '[' THEN
INSERT INTO `jmp` (`indice_code`) VALUES (i_code);
ELSE
IF char_code = ']' THEN
SET tmp = (SELECT `indice_code` FROM `jmp` WHERE `indice_jmp` IS NULL ORDER BY `indice_code` DESC LIMIT 1) ;
UPDATE `jmp` SET `indice_jmp` = i_code WHERE `indice_code` = tmp;
END IF;
END IF;
SET i_code = i_code + 1;
UNTIL i_code > len_code END REPEAT;
END;|
/*
CALL PARSECODE("[ [ ] [ ] ]");|
SELECT * FROM `jmp`;|
*/
DROP FUNCTION IF EXISTS bf;|
CREATE FUNCTION bf ( code TEXT, input TEXT) RETURNS TEXT
BEGIN
DECLARE i_code, len_code INT;
DECLARE char_code CHAR;
DECLARE stdout TEXT;
DECLARE i_input INT;
DECLARE i_memory INT;
DECLARE i_stack INT;
DECLARE tmp INT;
CALL PARSECODE(code);
DELETE FROM `memory`;
SET i_code = 0;
SET i_stack = 0;
SET len_code = LENGTH(code);
SET stdout = "";
SET i_memory = 0;
SET i_input = 0;
REPEAT
SET char_code = CHARAT(code, i_code);
CASE char_code
WHEN '.' THEN
SET stdout = CONCAT(stdout, CHAR(GETMEM(i_memory) ));
WHEN ',' THEN
BEGIN
CALL SETMEM(i_memory, CHARAT(input, i_input));
SET i_input = i_input + 1;
END;
WHEN '>' THEN
SET i_memory = i_memory + 1;
WHEN '<' THEN
SET i_memory = i_memory - 1;
WHEN '+' THEN
CALL SETMEM(i_memory, GETMEM(i_memory) + 1);
WHEN '-' THEN
CALL SETMEM(i_memory, GETMEM(i_memory) - 1);
WHEN '[' THEN
BEGIN
IF GETMEM(i_memory) = 0 THEN
SET i_code = (SELECT `indice_jmp` FROM `jmp` WHERE `indice_code` = i_code);
END IF;
END;
WHEN ']' THEN
BEGIN
SET i_code = (SELECT `indice_code` FROM `jmp` WHERE `indice_jmp` = i_code);
SET i_code = i_code - 1;
END;
ELSE
BEGIN
END;
END CASE;
SET i_code = i_code + 1;
UNTIL i_code > len_code END REPEAT;
RETURN stdout;
END;|
Conclusion
pour tester :
CALL SETMEM(1, 12);| SELECT GETMEM(0), GETMEM(1);|
CALL SETMEM(1, 12);| SELECT GETMEM(0), GETMEM(1);|
SELECT bf("+++++[->+++++++++++<]>.", "") AS result;| /* affiche 7 */ SELECT bf("++++++++++++++++++++++++++++++++++++++++++++++ ++.", "") AS result;| /* affiche 2 */ /*hello world*/ SELECT bf("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++. >+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------ .--------.>+.>.", "") AS result;|
Historique
- 18 août 2008 18:56:51 :
- pour le code : [...]
j'interpretais :
do{ ...}while(*ptr);
or, le vrai brainfuck, c'est :
while(*ptr){ ... }
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
VB - requete mysql en utilisant des fonctions intégrées [ par nath_77 ]
Bonjour à tous,J'ai un problème dont je ne trouve pas la solution.Je travaille sous access avec un bdd Mysql . Je veux au cours de mon application eff
Première fonction MySQL [ par RaphAstronome ]
Bonjour,Je suis en train de faire ma première fonction MySQL.Elle est sensé traduire un BIGINT en BLOB mais il semble qu'il y est une érreur de sytaxe
Somme de champs MySQL [ par dthuler ]
Bonjour à tous,Voilà une question de débutant:Je cherche le moyen (fonction?) d'additionner les valeurs d'un champ d'une sélection SQL (voir exemple c
Comment créer une procedure avec mysql [ par gregoire2008 ]
Bonjour, ma question est peut être un peu débile mais je n'arrive pas à créer de procédure stockée avec mysql. J'utilise la version 4.1.9 et quand je
procedure select [ par abdoulax ]
Bonjour,Je suis en train de faire un projet oracle pour mes études. Ce projet mélange du php avec une base oracle. Lors d'un bilan en cours de projet
help svp [ par melleweb ]
je cherche une fonction de manipulation des chaines de caractères en pl/sql ou sql pareil a cet exemple:fonction_recherchée('salut tout le monde','mon
helr please [ par melleweb ]
je cherche une fonction de manipulation des chaines de caractères en pl/sql ou sql pareil a cet exemple:fonction_recherchée('salut tout le monde','mon
Bdlink oracle vers Mysql [ par rabdou ]
Salut tous le mondeje vx Utilise des services d'accès hétérogènes d'ORACLE pour accéder à une base de données mysql(oracle sous windows et mysql aussi
Procedure stocker avec toad [ par lightzeus ]
<td id="HB_Focus_Element" valign="top"
Conversion de dates [ par Chatbour ]
Salut à tous je voudrais savoir s'il existe une fonction Access qui convertie les date à l'anglaise (#mois-jour-année#) au format français (#jour-mois
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Forum
BESOIN D'UN BIBESOIN D'UN BI par michimichid
Cliquez pour lire la suite par michimichid
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System 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 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
|