Forum dédié aux énigmes et à toutes formes de jeux de logique. | Déconnexion |
Tu n'es pas identifié sur Prise2tete : s'identifier. |
#1 - 10-01-2015 01:20:23
apprebdre à programmer en brainfuckJ'ai trouvé un super tuto (en anglais mais très compréhensible car très visuel) pour Code:+++++ +++ [ > +++++ ++ > ++++ > + > ++++ [ > +++++ +++ < - ] >>>> > +++++ + > +++++ ++ >>> > +++++ + > +++++ ++ >>> > +++++ + > +++++ ++ <<<<< <<<<< <<<<< <<<<< - ] > ++ >> ++ >> >>>>> ++ >>>>> ++ >>>>> ++ <<<<< <<<<< <<<<< <<<<< >>>>> > + [ - >>> . >>>>> . >>>>> . <<<<< <<<<< <<<<< <<< . > . >> . < . >>>>> >>>>> >>>>> > + [ - >- >>>+ <<<< ] >>+ < [ >- ] > [ > ] > [ <<<+ <+ >>>>- ] <<<< >> [ << ----- ----- <<<<< + >>>>> >> - ] << <<<<< [ - >- >>>+ <<<< ] >>+ < [ >- ] > [ > ] > [ <<<+ <+ >>>>- ] <<<< >> [ << ----- ----- <<<<< + >>>>> >> - ] << <<<<< <<<<< + [ - >- >>>+ <<<< ] >>+ < [ >- ] > [ > ] > [ <<<+ <+ >>>>- ] <<<< >> [ > + < - ] + > [ < - > - ] < ] Je vous conseille ce super interpréteur de BF : Ici Code:1)++++++++++ 2)[ 3) >++++++++>++++++<<- 4)] 5)>. 6)>+++++. 7)<++. 8)>+++. 9)<---. 10)-. Explications : "L'expérience est une lanterne qui n'éclaire que celui qui la porte." L-F. Céline
#0 Pub#2 - 02-01-2017 10:08:50
Apprendre à programmer en rainFuckJe déterre un vieux sujet, mais bon: en faisant de la place sur mon disque, j'ai retrouvé ça: Code:>,[>+++++++[-<------>]+<[-[--[--[>-<-<[->++++++++++<]>[-<+>]]>[->>]<]>[<++>->>]<]>[<+++>->>]<]>[<+>->>]<,]<<[->>+<<]>[-<+>]>[-<+>]+<[-[-[->-<<[-<+>]>]>[-<<[->+<]<[->+<]>[>>>+<<<>[-<-[<]>>]>[<<[>>>++++[-<+++++++++++>]<.[-]<<[-<+>]]>]>[-]<<<[-<+>]]>>+<[>-<<<+++++[->+++++++++<]>.[-]>[-<<+>>]>>]>[->>]<<]<]>[-<<<[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]>]<]>[-<+<<[>>[-]<<>[->+>+<<]>[-<<-[>]>>>[>+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+<<[-<<+>>]<<<]>>[<[-]>->>>+<<<]>>>[-<<<<<+>>>>>]<<<<<->>>]<<<[->>>+<<<]>>>>+<[>[-]<>++++++++++<[>[->+>+<<]>[-<<-[>]>>>[>+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+<<[-<<+>>]<<<]>>++++++[-<++++++++>]<[-<+>]>>>>[-<<<<+>>>>]<<<<-]>[+++++[-<++++++++>]>]<<[.[-]<]<[>>>++++++++[-<++++<++++>>]<++++++++++++.<.>++++++[->++>++<<]>++++++++++++++.>+.<+.+.>.[-]<[-]<<.[-]<[>++++++++++<[>[->+>+<<]>[-<<-[>]>>>[>+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+<<[-<<+>>]<<<]>>++++++[-<++++++++>]<[-<+>]>>>>[-<<<<+>>>>]<<<<-]<[.[-]<]>]< (une version plus "lisible", si on peut dire) Code:>,[>+++++++[-<------>]+<[-[--[--[>-<-<[ ->++++++++++<]>[-<+>]]>[->>]<]>[<++>->> ]<]>[<+++>->>]<]>[<+>->>]<,]<<[->>+<<]> [-<+>]>[-<+>]+<[-[-[->-<<[-<+>]>]>[-<<[ ->+<]<[->+<]>[>>>+<<<>[-<-[<]>>]>[<<[>> >++++[-<+++++++++++>]<.[-]<<[-<+>]]>]>[ -]<<<[-<+>]]>>+<[>-<<<+++++[->+++++++++ <]>.[-]>[-<<+>>]>>]>[->>]<<]<]>[-<<<[-> [->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]>]< ]>[-<+<<[>>[-]<<>[->+>+<<]>[-<<-[>]>>>[ >+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+< <[-<<+>>]<<<]>>[<[-]>->>>+<<<]>>>[-<<<< <+>>>>>]<<<<<->>>]<<<[->>>+<<<]>>>>+<[> [-]<>++++++++++<[>[->+>+<<]>[-<<-[>]>>> [>+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+ <<[-<<+>>]<<<]>>++++++[-<++++++++>]<[-< +>]>>>>[-<<<<+>>>>]<<<<-]>[+++++[-<++++ ++++>]>]<<[.[-]<]<[>>>++++++++[-<++++<+ +++>>]<++++++++++++.<.>++++++[->++>++<< ]>++++++++++++++.>+.<+.+.>.[-]<[-]<<.[- ]<[>++++++++++<[>[->+>+<<]>[-<<-[>]>>>[ >+<<[>>-<<[->-<]]>>[-<[-]>>+<]]<<]>>>+< <[-<<+>>]<<<]>>++++++[-<++++++++>]<[-<+ >]>>>>[-<<<<+>>>>]<<<<-]<[.[-]<]>]< Voilà, sans commentaires ni indications j'ai eu un peu de mal à retrouver ce que j'avais voulu faire, mais j'ai fini par y arriver #3 - 03-01-2017 11:14:50
Apprendre à programmmer en BrainFuckEt voilà une version commentée. il s'agit en fait d'une calculatrice en BF... Code:>, ;On laisse un zéro puis on lit un caractère [ ; >+++++++[-<------>]+< ;On lui enlève 42 et on met un 1 après (indicateur de symbole) [ ;Cas "tout sauf l'étoile" - ;On enlève encore 1 [ ;Cas "ni étoile ni plus" -- ;On enlève encore 2 [ ;Cas "barre oblique ou chiffre" -- ;On enlève encore 2 [ ;Cas "chiffre uniquement" >-< ;On passe l'indicateur de symbole à false - ;On enlève encore 1 pour avoir la valeur numérique du chiffre <[->++++++++++<]> ;On lui ajoute 10 fois le nombre précédent (lecture en base 10) [-<+>] ;On le déplace sur la cellule précédente ] ;Fin du cas "chiffre uniquement" et retour au cas "barre oblique ou chiffre" > ;On passe sur l'indicateur de symbole [ ;Cas "barre oblique uniquement" - ;0 sera le code de la division et on passe l'indicateur de symbole à false >> ;On saute deux cases pour passer au nombre suivant ] ;Fin du cas "barre oblique uniquement" et retour au cas "barre oblique ou chiffre" < ;On revient sur l'octet de lecture (cas d'un chiffre) ou après l'indcateur de symbole (cas de la barre oblique) ] ;Fin du cas "barre oblique ou chiffre" et retour au cas "ni étoile ni plus" > ;On passe sur l'indicateur de symbole (ou deux cases après dans le cas de la barre oblique) [ ;Cas "moins uniquement" <++>- ;2 sera le code de la soustraction et on passe l'indicateur de symbole à false >> ;On saute deux cases pour passer au nombre suivant ] ;Fin du cas "moins uniquement" et retour au cas "ni étoile ni plus" < ;On revient sur l'octet de lecture (cas d'un chiffre) ou après l'indcateur de symbole (cas de la barre oblique ou du moins) ] ;Fin du cas "ni étoile ni plus" et retour au cas "tout sauf étoile" > ;On passe sur l'indicateur de symbole (ou deux cases après dans le cas de la barre oblique ou du moins) [ ;Cas "plus uniquement <+++>- ;3 sera le code de l'addition et on passe l'indicateur de symbole à false >> ;On saute deux cases pour passer au nombre suivant ] ;Fin du cas "plus uniquement" et retour au cas "tout sauf étoile" < ;On revient sur l'octet de lecture (cas d'un chiffre) ou après l'indcateur de symbole (cas d'un symbole sauf étoile) ] ;Fin du cas "tout sauf étoile" > ;On passe sur l'indicateur de symbole (cas d'un chiffre ou étoile) ou deux case après dans les autres cas [ ;Cas "étoile uniquement" <+>- ;1 sera le code de la multiplication et on passe l'indicateur de symbole à false >> ;On saute deux cases pour passer au nombre suivant ] ;Fin du cas "étoile uniquement" < ;On revient sur l'octet de lecture (cas d'un chiffre) ou après l'indcateur de symbole (cas d'un symbole) , ;Lecture du caractère suivant ] ; << ;Tout est lu et on revient sur le code opérateur [->>+<<]>[-<+>]>[-<+>] ;On permute le code opérateur et la seconde opérande +< ;On met le "bit else" à 1 et on se place sur l'operateur [ ;Cas "addition/soustraction/multiplication" - ;On ote un au code [ ;Cas "addition/soustraction" - ;On ote un au code [ ;Cas "addition" - ;On ote un au code (qui vaut 0 maintenant normalement) >-< ;Réinitialisation du "bit else" < ;On passe sur la seconde opérande [-<+>] ;On réalise l'addition > ;On repasse sur le "bit else" ] ;Fin du cas "addition" > ;On passe sur le "bit else" [ ;Cas "soustraction" - ;Réinitialisation du "bit else" << ;On passe sur la seconde opérande [->+<]<[->+<] ;On décale les deux opérandes d'un cran à droite > ;On passe sur la première opérande [ ;Cas où la première opérande n'est pas nulle >>>+<<< ;On ajoute un autre "bit else" pour le signe du résultat >[-<-[<]>>]> ;On réalise la soustraction et on va voir si on est sur le bit de signe [ ;Cas négatif ou nul << ;On regarde le résultat [ ;Cas négatif >> ;On revient sur le bit de signe >++++ ;On accelère un peu le calcul du symbole "moins" [-<+++++++++++>]<. ;On affiche le symbole "moins" [-] ;On réinitialise le bit de signe <<[-<+>] ;On copie le résultat "négatif" en résultat "positif" ] ;Fin du cas négatif > ;On revient avant le bit de signe ] ;Fin du cas négatif ou nul >[-] ;On vide le bit de signe <<<[-<+>] ;Copie du résultat en première position ] ;Fin du cas ou la première opérande n'est pas nulle >>+< ;Cas où la première opérande est nulle avec un bit else pour le cas où la seconde l'est aussi [ ;Si la seconde est non nulle >-< ;On vire le bit else <<+++++[->+++++++++<]>. ;On affiche "moins" [-] ;On vide le symbole "moins" >[-<<+>>]>> ;On copie le résultat en première position et on revient au bon endroit ] ;Fun du cas où la seconde est non nulle >[->>]< ;Si les deux opérandes sont nulles on revient au bon endroit < ;On repasse sur le "bit else" ] ;Fin du cas "soustraction" < ;On repasse sur l'opérateur ] ;Fin du cas "addition/soustraction" > ;On passe sur le "bit else" [ ;Cas "multiplication" - ;Réinitialisation du "bit else" <<< ;On passe sur la première opérande [->[->+>+<<]>>[-<<+>>]<<<] ;On réalise la multiplication >[-]>[-<<+>>] ;On nettoye et on déplace le résultat en première position > ;On repasse sur le "bit else" ] ;Fin du cas "multiplication" < ;On repasse sur l'opérateur ] ;Fin du cas "addition/soustraction/multiplication" > ;On passe sur le "bit else" [ ;Cas "division" - ;Réinitialisation du "bit else" <+<< ;On passe sur la première opérande avec un "bit else" après les opérandes pour un dividende nul [ ;Tant que la division n'est pas finie >>[-]<< ;On reset le "bit else" du dividende nul >[->+>+<<] ;On duplique le diviseur > ;On passe sur la première copie [ ;Tant que la copie n'est pas nulle -<<-[>]>>> ;On la soustrait à la première opérande [ ;Cas ou le dividende est devenu nul (cas "division terminée") >+<< ;On place un "bit else" pour le cas où la copie est nulle (division "sans reste") [>>-<<[->-<]] ;S'il y a un reste on le calcule (différence entre la seconde copie de la seconde opérande et ce qu'il reste de la première copie) >>[-<[-]>>+<] ;S'il n'y a pas de reste on ajoute 1 au résultat ] ;Fin du cas "division terminée" << ;On revient sur la copie ] ;La copie a été soustraite à la première opérande >>>+<< ;On ajoute 1 au résultat (en trop après la dernière boucle) [-<<+>>] ;On recrée la seconde opérande <<< ;On se replace sur la première opérande ] ;Fin de la division >>[<[-]>->>>+<<<] ;Cas du dividende nul: on ajuste >>>[-<<<<<+>>>>>]<<<<<- ;On recopie le résultat en première position et on lui ote 1 >>> ;On se repositionne au même endroit que pour les autres calculs ] ;Fin du cas division <<<[->>>+<<<]>>> ;Décalage du résultat de 3 cases (en cas de "double résultat":division avec reste et quotient) >+< ;"Bit else" pour un résultat nul [ ;Tant que le résultat n'est pas nul >[-]< ;On réinitialise le "bit else" au besoin >++++++++++< ;On écrit "10" (pour faire une division et afficher le résultat en base 10) [ ;Tant que la division n'est pas finie >[->+>+<<] ;On duplique le diviseur > ;On passe sur la première copie [ ;Tant que la copie n'est pas nulle -<<-[>]>>> ;On la soustrait à la première opérande [ ;Cas ou le dividende est devenu nul (cas "division terminée") >+<< ;On place un "bit else" pour le cas où la copie est nulle (division "sans reste") [>>-<<[->-<]] ;S'il y a un reste on le calcule (différence entre la seconde copie de la seconde opérande et ce qu'il reste de la première copie) >>[-<[-]>>+<] ;S'il n'y a pas de reste on ajoute 1 au résultat ] ;Fin du cas "division terminée" << ;On revient sur la copie ] ;La copie a été soustraite à la première opérande >>>+<< ;On ajoute 1 au résultat (en trop après la dernière boucle) [-<<+>>] ;On recrée la seconde opérande <<< ;On se replace sur la première opérande ] ;Fin de la division >>++++++[-<++++++++>] ;On ajoute 48 au reste (pour afficher un chiffre) <[-<+>] ;On copie le reste en première position >>>>[-<<<<+>>>>]<<<<- ;On recopie le quotient en seconde position et on lui ote 1 ] ;On divise le quotient à son tour par 10 (pour avoir un résultat en base 10) >[+++++[-<++++++++>]>]< ;Cas du "bit else" à 1 (résultat nul): on ajoute 48 pour avoir le caractère 0 <[.[-]<] ;On affiche le résultat en base 10 < ;On se place sur le reste (éventuel) [ ;S'il y a un reste >>>++++++++[-<++++<++++>>] ;On commence par un peu de formattage <++++++++++++.<. ;(affichage d'une virgule puis ' reste ' >++++++[->++>++<<] ; >++++++++++++++.>+.<+.+.>. ; [-]<[-]<<.[-]< ;Fin du formattage [ ;Tant que le résultat n'est pas nul >++++++++++< ;On écrit "10" (pour faire une division et afficher le résultat en base 10) [ ;Tant que la division n'est pas finie >[->+>+<<] ;On duplique le diviseur > ;On passe sur la première copie [ ;Tant que la copie n'est pas nulle -<<-[>]>>> ;On la soustrait à la première opérande [ ;Cas ou le dividende est devenu nul (cas "division terminée") >+<< ;On place un "bit else" pour le cas où la copie est nulle (division "sans reste") [>>-<<[->-<]] ;S'il y a un reste on le calcule (différence entre la seconde copie de la seconde opérande et ce qu'il reste de la première copie) >>[-<[-]>>+<] ;S'il n'y a pas de reste on ajoute 1 au résultat ] ;Fin du cas "division terminée" << ;On revient sur la copie ] ;La copie a été soustraite à la première opérande >>>+<< ;On ajoute 1 au résultat (en trop après la dernière boucle) [-<<+>>] ;On recrée la seconde opérande <<< ;On se replace sur la première opérande ] ;Fin de la division >>++++++[-<++++++++>] ;On ajoute 48 au reste (pour afficher un chiffre) <[-<+>] ;On copie le reste en première position >>>>[-<<<<+>>>>]<<<<- ;On recopie le quotient en seconde position et on lui ote 1 ] ;On divise le quotient à son tour par 10 (pour avoir un résultat en base 10) <[.[-]<] ;On affiche le résultat en base 10 > ;On revient à la position initiale ] ;Fin du cas avec un reste < ;On remet le curseur à 0 parce que c'est plus propre Réponse rapideSujets similaires
Mots clés des moteurs de recherche
|
||||||||||||||||||||||||||||||||||
Prise2Tete Forum Statistiques Liste des membres Hall of Fame Contact |