Enigmes

Forum dédié aux énigmes et à toutes formes de jeux de logique.

Déconnexion

Tu n'es pas identifié sur Prise2tete : s'identifier.

accueil Accueil forum Forum
[+]

 #1 - 10-01-2015 01:20:23

shadock
Elite de Prise2Tete
Enigmes résolues : 39
Messages : 3334

apprendre à programmer en braonfuck

J'ai trouvé un super tuto (en anglais mais très compréhensible car très visuel) pour
apprendre l'essentiel de la programmation en BF en moins de 10 minutes montre en main donc je partage ! smile
Vidéo

Ah et une chose Dcode ne permet de trouver ce que fait ce code par exemple :

Code:

+++++ +++
[
    > +++++ ++
    > ++++
    > +

    >
    ++++
    [
        > +++++ +++
        < -
    ]

    >>>>
    > +++++ +
    > +++++ ++
    >>>
    > +++++ +
    > +++++ ++
    >>>
    > +++++ +
    > +++++ ++

    <<<<< <<<<< <<<<< <<<<< -
]

> ++
>> ++
>>
>>>>> ++
>>>>> ++
>>>>> ++

<<<<< <<<<< <<<<< <<<<<
>>>>> >
+
[
    -

    >>> .
    >>>>> .
    >>>>> .
    <<<<< <<<<< <<<<< <<<
    .
    > .
    >> .
    < .
        >>>>> >>>>> >>>>> >
        +
            
            [
                -
                >-
                >>>+
                <<<<
            ]
            >>+ 
            <   
            [
                >- 
            ]
            >  
            [
                >
            ]
            > 
            [
                <<<+
                <+
                >>>>-
            ]
            <<<<  
        >>
        [
            << ----- -----
            <<<<< +
            >>>>> >> -
        ]
        <<

        <<<<<
            
            [
                -
                >-
                >>>+
                <<<<
            ]
            >>+
            <   
            [
                >-
            ]
            >
            [
                >
            ]
            >  
            [
                <<<+
                <+
                >>>>-
            ]
            <<<<   
        >>
        [
            << ----- -----
            <<<<< +
            >>>>> >> -
        ]
        <<

    <<<<< <<<<<
    +

        
        [
            -
            >-
            >>>+
            <<<<
        ]
        >>+ 
        <   
        [
            >-  
        ]
        >  
        [
            >
        ]
        > 
        [
            <<<+
            <+
            >>>>-
        ]
        <<<<   

    >>

        
        [
            > +
            < -
        ]
        +
        >
        [
            < -
            > -
        ]
        <
]

Je vous conseille ce super interpréteur de BF : Ici

Voilà que dire de plus mon premier programme en BF à permis de coder en 58 caractères le code qui affiche le mot "pardon" alors que la version de dcode en a 149 si ma mémoire est bonne big_smile

Voici le code avec les explications en dessous ligne par ligne ! (voir la vidéo vous aidera à comprendre comment j'explique)

Code:

1)++++++++++
2)[                         
3)    >++++++++>++++++<<-   
4)]                         
5)>.                        
6)>+++++.                   
7)<++.                      
8)>+++.                     
9)<---.                     
10)-.

Explications :
1- On commence à a[0]=10
2- On commence la boucle
3- On va à a[1] on ajoute 8 puis on va à a[2] on ajoute 6 on a donc a[0]=10, a[1]=8 et a[2]=6 puis on retourne à a[0] et on enlève 1 on a donc a[0]=10-1=9(indiqué par <<) et on recommence on va à a[1] on ajoute 8 etc... jusqu'à ce que a[0]=0 on se retrouve donc avec a[0]=0, a[1]=80 et a[2]=60 ! Et en caractère ASCii 80 correspond au P et 60 à < sachant que A est à 64 mais vous comprendrez ensuite...
4- On fini la boucle et on passe à la ligne 5 puisque a[0]=0
5- On était resté sur a[0] on va donc sur a[1]=80 et on affiche le symbole grâce à l'instruction "." ce qui donne P
6- On était sur a[1] on va sur a[2] et on ajoute 5 ce qui donne a[2]=65 et on affiche ensuite à l'aide de "." ce qui donne A
7- On redescend de a[2] vers a[1]=80 on ajoute 2 a[1]=82 et on affiche R
8- On remonte vers a[2] on ajoute 3 soit a[2]=68 et on affiche D
9- On redescend sur a[1] on enlève 3 et on affiche donc O
10- On enlève encore 1 à a[1] et on affiche N

Voilà tout !! smile

Shadock cool


"L'expérience est une lanterne qui n'éclaire que celui qui la porte." L-F. Céline
  • |
  • Répondre

#0 Pub

 #2 - 02-01-2017 10:08:50

scarta
Elite de Prise2Tete
Enigmes résolues : 49
Messages : 1934

apprendre à programmer zn brainfuck

Je déterre un vieux sujet, mais bon: en faisant de la place sur mon disque, j'ai retrouvé ça:

(une version sans mise en page pour que ça marche sur DCode)

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 smile
Et vous ?

Spoiler : [Afficher le message] Le programme attend une chaine en entrée, composée uniquement de chiffres, à un caractère  près qui n'est pas un chiffre 

 #3 - 03-01-2017 11:14:50

scarta
Elite de Prise2Tete
Enigmes résolues : 49
Messages : 1934

Apprenre à programmer en BrainFuck

Et voilà une version commentée. il s'agit en fait d'une calculatrice en BF...
On peut donner des opérations comme 2*5, 3-7, 6+6 ou encore 55/12, et il répondra respectivement 10, -4, 12 ou encore "4, reste 7"
Quand c'est Turing-complet, on peut tout faire smile


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 rapide

Rédige ton message
| | | | Upload | Aide
:) :| :( :D :o ;) :/ :P :lol: :mad: :rolleyes: :cool:
Sécurité

Répondez à la devinette suivante : 

Le père de toto a trois fils : Pif, Paf et ?

Sujets similaires

Sujet Date Forum
18-04-2011 Blabla
15-09-2010 Blabla
P2T
Merci, M. Mano Solo par MthS-MlndN
11-01-2010 Blabla
17-03-2010 Blabla
P2T
Simple question par Autleaf
24-02-2011 Blabla
P2T
Une orpheline de plus par emmaenne
21-01-2011 Blabla
P2T
31-08-2014 Blabla
08-07-2008 Blabla
P2T
Il faut être sport... par SaintPierre
01-04-2011 Blabla

Mots clés des moteurs de recherche

Mot clé (occurences)

Pied de page des forums

P2T basé sur PunBB
Screenshots par Robothumb

© Copyright 2002–2005 Rickard Andersson

Prise2Tete Forum Statistiques Liste des membres Hall of Fame Contact
© Prise2tete - Site d'énigmes et de réflexion.
Un jeu où seules la réflexion, la logique et la déduction permettent de trouver la solution.

Flux RSS de Prise2Tete Forum Jeux & Prise2Tete Test & Prise2Tete Partenariat et Publicité sur Prise2Tete