Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Befunge] Où l'apprendre ?

Période : langages exotiques

Sujet résolu
    3 octobre 2009 à 16:30:44

    Bonjour !

    En ce moment, j'aime bien apprendre un peu les langages de programmation "exotiques" (brainfuck, spoon).

    Seulement, je cherche des tutoriels (français plutôt) sur Befunge, mais je ne trouve rien ...

    Quelqu'un pourrait-il m'aider ?

    Merci ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 octobre 2009 à 16:37:31

      Il me semblait que l'on t'avait déjà répondu, non?

      Ca ne sert à rien le brainfuck. Si, à poser des ateliers pour créer son propre interpréteur.

      On t'a dit aussi que le wiki était suffisant, quoique... :-° (Pour moi il ne l'est pas, mais c'est parce-que j'ai pas le niveau). Si tu l'as cela suffit pour toi.

      On te donnera pas plus d'infos que ce qui t'as déjà été donné, pas la peine d'insister.

      • Partager sur Facebook
      • Partager sur Twitter
        3 octobre 2009 à 16:38:06

        Befunge pas Brainfuck :-°

        Y'a un article sur wiki mais je ne le trouve pas très complet ...
        Pour ça que je demaindais de l'"aide" j'ai cherché partout et rien trouvé sur quatre moteurs de recherche différents ...
        • Partager sur Facebook
        • Partager sur Twitter
          3 octobre 2009 à 18:12:03

          Citation : Shydow

          Y'a un article sur wiki mais je ne le trouve pas très complet ...
          Pour ça que je demaindais de l'"aide" j'ai cherché partout et rien trouvé sur quatre moteurs de recherche différents ...



          En fait, j'éditais pendant que tu postais :-°

          Donc voilà, l'article de wiki est pas très voire pas du tout explicite ...
          • Partager sur Facebook
          • Partager sur Twitter
            3 octobre 2009 à 18:21:36

            Sinon tu peux apprendre un autre langage exotique appelé l'anglais et aller voir sur le wiki anglais.
            • Partager sur Facebook
            • Partager sur Twitter
              3 octobre 2009 à 21:36:37

              L'article français explique déjà tout très bien hein.
              • Partager sur Facebook
              • Partager sur Twitter
                4 octobre 2009 à 1:15:14

                Bah c'est l'autre qui dit que l'article du wiki n'est pas complet...
                • Partager sur Facebook
                • Partager sur Twitter
                  4 octobre 2009 à 8:07:40

                  Citation : Sprank

                  Sinon tu peux apprendre un autre langage exotique appelé l'anglais et aller voir sur le wiki anglais.



                  Ok, je l'avais pas vu celui-là ... Y'a plus de liens, plus de compilateurs ...
                  Bon ben c'est bon, merci à tous ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 octobre 2009 à 12:27:00

                    Nan mais shydow, si tu n'y arrives pas avec le wiki français, c'est pas la peine. C'était bien à toi que je parlais, pas à sprank.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 octobre 2009 à 15:44:00

                      Je me permet de remonter ce thread car le Befunge m'intéresse aussi :

                      >              v
                      v  ,,,,,"Hello"<
                      >48*,          v
                      v,,,,,,"World!"<
                      >25*,@


                      Pour rappel :

                      > Déplace vers la droite
                      v Déplace vers le bas
                      , Dépile une valeur et l'affiche en tant que caractère ASCII

                      Je ne comprend pas pourquoi on commence par se déplacer vers la droite puis vers le bas, de même je ne comprend pourquoi on "dépile" 5 valeurs alors qu'aucune valeur n'a été empilé ? :euh:
                      J'espère que quelqu'un saura me repondre :(

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 octobre 2009 à 16:14:36

                        Je fais pas de Befunge par contre il est facile de comprendre que "Hello" a été ajouté à la pile (empilé quoi), après, pourquoi dépiler 5 fois ? Il est probable que la syntaxe pour les chaines de caractères soit juste du sucre pour une liste d'entiers (le code ASCII des lettres).

                        Pour ce qui est du « on va à droite puis à gauche ». Si mes suppositions sur la syntaxe des string est exacte, voici ce qui ce passe quand tu écris "Hello", On met H sur la stack, puis e, puis l (2 fois) puis o.
                        Donc si après on veut afficher (avec ,) on va pop le premier élément, puis le second, etc etc.
                        Le résultat sera donc : « olloeH ». Pas vraiment ce qu'on veut.
                        Pour corriger ça il faut ajouter les éléments à la pile dans l'ordre inverse, pour ça il y a deux solutions, on écrit "olleH" ou on inverse le sens de parcours du code (ce qui est fait ici donc).

                        Pour le world c'est la même idée. Après on peut supposer que le 48*, affiche un espace et le 25*, fait un retour à la ligne.

                        Pour ce qui est du @ je ne sais pas ce que ça fait, c'est probablement pour indiquer la fin d'un bloc/programme.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 octobre 2009 à 17:01:21

                          Merci pour cette réponse,
                          Je pense avoir compris mais ce n'est pas clair pour autant :D d'après la définition de wikipedia :

                          Citation : Wikipedia

                          Il diffère des langages conventionnels par le fait qu'il est arrangé sur une grille à deux dimensions. Des instructions "flèche" dirigent le flux de contrôle à gauche, à droite, en haut, en bas, et des boucles sont construites en envoyant le flux de contrôle dans un cycle.



                          (Mince je ne sais pas comment faire un tableau avec le zcode donc je vais essayer d'etre le plus clair possible)

                          Bon alors en gros la pile est un tableau (puisque 2D); Voici donc l'interpretation du code :

                          >              v
                          v  ,,,,,"Hello"<
                          >48*,          v
                          v,,,,,,"World!"<
                          >25*,@


                          1) On va dans la deuxième colonne et on descend de 2 lignes (sous entendu à la 3eme ligne)
                          2) A partir de là on affiche 5 caractere et on y met nos 5 lettres (?)
                          3) Ensuite on va a gauche et on reviens à droites :euh:
                          4) Puis on multiplie 4 par 8 qui donne 32 (= Espace en ASCII)
                          5) Ensuite on l'affiche et on descend de deux ligne
                          et on recommence l'operation pour world

                          En bref je pense comprendre le code, mais je n'arrive pas a me représenter les "mouvement" dans la pile.
                          De plus je ne comprend pas pourquoi (2) on affiche les caractère (sous entendu on les dépile) avant de les avoir empiler alors que l'on fait l'inverse juste après (en 4 et 5).

                          Et plus j'y reflechi moins je comprend les mouvements dans la pile, par exemple le gauche -> droite (3) ou encore le debut (1)...

                          Pour que ce soit plus simple :

                          0-9  Empile ce nombre sur la pile
                          +  Addition: dépile a et b, puis empile a+b
                          -  Soustraction: dépile a et b, puis empile b-a
                          *  Multiplication: dépile a et b, puis empile a*b
                          /  Division entière: dépile a et b, puis empile la partie entière de b/a. Si a est nul, demande à l'utilisateur le résultat voulu.
                          %  Modulo: dépile a et b, puis empile le reste de la division entière de b/a. Si a est nul, demande à l'utilisateur le résultat voulu.
                          !  NON logique: dépile une valeur. Si elle est nulle, empile 1; sinon, empile 0.
                          `  Plus grand que: Dépile a et b, puis empile 1 si b>a, sinon 0.
                          >  Déplace vers la droite
                          <  Déplace vers la gauche
                          ^  Déplace vers le haut
                          v  Déplace vers le bas
                          ?  Déplace vers une direction aléatoire
                          _  Dépile une valeur; déplace à droite si valeur=0, à gauche sinon
                          |  Dépile une valeur; déplace en bas si valeur=0, en haut sinon
                          "  Démarre le mode chaine de caractère: empile chaque valeur ASCII jusqu'au prochain "
                          :  Duplique la valeur en sommet de pile
                          \  Permute les deux valeurs en sommet de pile
                          $  Dépile une valeur
                          .  Dépile une valeur et l'affiche en tant qu'entier
                          ,  Dépile une valeur et l'affiche en tant que caractère ASCII
                          #  Trampoline: saute la cellule suivante
                          p  Dépile y, x et v, puis change les caractères à la position (x,y) dans le programme en le caractère dont le code ASCII est v
                          g  Dépile y et x, puis empile la valeur ASCII du caractère situé à cette position dans le programme
                          &  Demande un nombre à l'utilisateur et l'empile
                          ~  Demande un caractère à l'utilisateur et empile son code ASCII
                          @  Termine le programme


                          Encore merci.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2009 à 17:48:51

                            Le fil de ton programme n'est pas bon, regarde bien les ">" qui provoquent la lecture de la ligne :

                            1) on parcourt la première ligne de gauche à droite (>)
                            2) on descend d'une ligne (v)
                            3) on commence à se diriger vers la droite (<)

                            Ensuite, on empile o puis l puis... puis h, on dépile (en commençant par le dernier élément empilé, qui est donc h) etc. comme Dark-Side t'a expliqué.
                            Et comme on ne peut pas empiler 32 en écrivant 32 (puisqu'il empilerait 3 puis 2), on le fait en empilant 4, puis 8, et ensuite l'instruction * dépile les deux dernières valeurs empilées et empile leur produit.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 octobre 2009 à 17:56:08

                              Merci bien, je pense avoir tout compris, enfaite j'interprétais mal la signification des flèches ;-)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 octobre 2009 à 22:32:02

                                Haha, c'est super funky comme langage en vrai.
                                Un autre hello world ici :
                                >                 v
                                v "Hello World!"0 <
                                v    <
                                > ,: |
                                @,*25<


                                Deuxième version plus concise :
                                >                 v
                                v "Hello World!"0 <
                                v    _ 25* , @
                                > ,: ^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 octobre 2009 à 22:53:53

                                  En pratique, le code est un "torus" : Si on sort de la carte, on réapparaît de l'autre côté. Donc :

                                  <v"Hello World!"0
                                   >:#,_25*,@
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 octobre 2009 à 23:07:24

                                    Oh. Fun :)
                                    Ah sinon, une boucle infinie :
                                    v<
                                    >^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 octobre 2009 à 1:49:08

                                      Le programme vide est déjà une boucle infinie si t'avais écouté :-° ...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 octobre 2009 à 16:36:48

                                        Ah bon ?

                                        Et Dark-side tes "hello world" n'afficheront rien, non ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 octobre 2009 à 18:20:37

                                          Sisi ! Note la présence des virgules.
                                          Btw lasts, plus court:
                                          <@,*52_,#:<"Hello World!"0
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 octobre 2009 à 19:04:42

                                            Je ne comprend pas ton dernier code :

                                            1) Pour le 0 je suppose que c'est pour interagir avec le _ sauf que le _ doit depiler la derniere valeur empiler ce qui correspond au H non ?

                                            2) Je ne voit pas l'intérêt du < juste avant Hello

                                            3) Tu n'utilise qu'une seul virgule or la virgule ne depile qu'un seul élément selon le premier exemple de "Hello World" que j'ai donné un peu plus haut

                                            Voilà voilà
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 octobre 2009 à 19:33:45

                                              Dark-Side, t'aurais pas inversé le sens du _ ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 octobre 2009 à 23:27:04

                                                Si Maxibolt, j'ai écris ça sur le coup, et en fait ça passe pas (j'y ai pensé juste après avoir posté mais trop tard, j'étais plus chez moi :p )

                                                John : mon dernier code est faux, ne fais pas attention.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  9 octobre 2009 à 23:28:54

                                                  Citation : John.l

                                                  Je ne comprend pas ton dernier code :

                                                  1) Pour le 0 je suppose que c'est pour interagir avec le _ sauf que le _ doit depiler la derniere valeur empiler ce qui correspond au H non ?

                                                  2) Je ne voit pas l'intérêt du < juste avant Hello

                                                  3) Tu n'utilise qu'une seul virgule or la virgule ne depile qu'un seul élément selon le premier exemple de "Hello World" que j'ai donné un peu plus haut

                                                  Voilà voilà



                                                  1) c'est pour permettre de sortir du programme quand il sera dépilé par l'underscore. Comme tu le sous entends, c'est le dernier dépilé d'ailleurs, c'est bien foutu non ? :-°

                                                  2) c'est pour faire demi-tour quand le flux est redirigé à droite par l'underscore. Note aussi le dièse qui permet de sauter soit la virgule, soit les deux points (selon le sens du flux), pour exécuter les instructions dans l'ordre.

                                                  3) Grâce au va-et-vient créé par l'underscore et la fameuse flèche à côté du hello world, on passe sur la virgule plusieurs fois. :D


                                                  Sinon je suis d'accord avec Maxibolt, l'underscore est dans le mauvais sens. On est obligés de faire le programme au moins sur deux lignes, étant donné l'ordre d'empilage de la chaîne de caractères qui est du sens contraire de l'arobase par rapport à l'underscore.

                                                  <v"Hello world !"0
                                                   >:#,_25*,@

                                                  (code de lastsseldon)

                                                  On pourrait tout de même tenter de mettre quand même sur une ligne dans le bon ordre, mais dans ce cas il faut une astuce pour sauter le morceau, c'est à dire exécuter des instructions en sens inverse qui puissent nous faire retomber sur nos pieds en les repassant à la fin.


                                                  Edit : mouarf Dark-Side est passé avant moi ... :-°
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 octobre 2009 à 11:38:59

                                                    Et si on fait comme Dark-Side a dit en écrivant "hello world à l'envers", ça devrait marcher, non ?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 octobre 2009 à 11:59:45

                                                      Oui mais c'est bof lisible.

                                                      Sinon, pour ceux que ça intéresse j'ai codé un plus ou moins en vitesse hier soir, il est disponible ici: http://paste.pocoo.org/raw/144035/

                                                      Par contre il y a un petit bug (enfin pas un bug, juste une situation non gérée). Je vous laisse trouver laquelle. :)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 octobre 2009 à 12:45:40

                                                        Ben ça a l'air super mais sans interpréteur ou compilateur c'est pas très fun :p
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          10 octobre 2009 à 13:43:25

                                                          Avec un interpréteur, tu trouves ça si fun que ça, le + ou - ?

                                                          Perso, je préfère comme ça.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            10 octobre 2009 à 14:45:30

                                                            Si je le comprends bien, le code de génération du nombre aléatoire est "faux" : multiplier deux nombres entre 1 et 9 tirés uniforméments au hasard, ça ne donne pas une distribution uniforme entre 1 et 81. Il faudrait faire <math>\(9 * (a - 1) + b\)</math> pour avoir une distribution aléatoire entre 1 et 80 inclus.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            [Befunge] Où l'apprendre ?

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown