# Brainfuck

**URL:** <https://www.debian-fr.org/t/brainfuck/7713>\
**Category:** Pause Café\
**Created:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713 "2016-02-20T15:53:04Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/1 "2016-02-20T15:53:04Z")

</div>

Allez, voilà de la programmation qui estune bonne initiation au perl 😃, Que font les programmes suivants en brainfuck? (PS: pas la peine de chercher sur google, c’est de la production perso…)

```auto

```

et

`,<+>[>+++[->+>+<<]>>[-<<+>>]<<<[->>>+<<<]>>[-<<+>>]<<-[->>>[-<+>]<<<<[->>>>+<<<<]>[-<+>]>[-<+>]<<]>[->>[-<<<+>>>]
<<[->+<]>]<<<[->>+>+<<<]>>>[-<<<+>>>]<<<[-]>[-<+>]>[-<+>]<<[->>+>+<<<]>>>[-<<<+>>>]<[-<+>]<>+++-[->+>+<<]>>[-<<+>>]<<
<[->>>+<<<]>>[-<<+>>]<<-[-<[->>>+<<<]>[-<+>]>[-<+>]<<]<[->+<]>>[->>[-<<<<+>>>>]<<[->+<]<[->+<]>>]<[-<+>]<-]<[-]<.`

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/2 "2016-02-20T15:53:06Z")

</div>



---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/3 "2016-02-20T15:53:06Z")

</div>

[quote=“ricardo”]0[/quote]Non, non… [http://fr.wikipedia.org/wiki/Brainfuck](http://fr.wikipedia.org/wiki/Brainfuck) sinon, c’est amusant, Wikipedia donne des macros pour programmer classiquement via des variables numérotées alors que je me suis plutôt orienté sur des manipulations de pile type Forth ou langage HP48…

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/4 "2016-02-20T15:53:11Z")

</div>

Je suis flemmard.  
Alors j’ai bêtement suivi le lien vers un compiateur fourni dans la page wikipedia:  
[savannah.nongnu.org/projects/libbf/](http://savannah.nongnu.org/projects/libbf/)  
Sauf que:  
[download.savannah.nongnu.org/releases/libbf/](http://download.savannah.nongnu.org/releases/libbf/)  
donc j’ai cherché un peu moins loin (toujours la flemme)

[code]roc@roc:~/.wine/drive\_c/windows/system32$ aptitude search libbf  
v libbfd-dev -  
roc@roc:~/.wine/drive\_c/windows/system32$ aptitude show libbfd-dev  
Pas de version courante ou candidate trouvée pour libbfd-dev  
Paquet : libbfd-dev  
État: n’est pas un paquet réel  
Fourni par : binutils-dev  
roc@roc:~/.wine/drive\_c/windows/system32$ aptitude search fuck  
v libacme-brainfuck-perl -  
roc@roc:~/.wine/drive\_c/windows/system32$ aptitude show libacme-brainfuck-perl  
Pas de version courante ou candidate trouvée pour libacme-brainfuck-perl  
Paquet : libacme-brainfuck-perl  
État: n’est pas un paquet réel  
Fourni par : libacme-brainfck-perl  
roc@roc:~/.wine/drive\_c/windows/system32$ aptitude show libacme-brainfck-perl  
Paquet : libacme-brainfck-perl  
État: non installé  
Version : 1.1.1  
Priorité : optionnel  
Section : interpreters  
Responsable : Jaldhar H. Vyas [jaldhar@debian.org](mailto:jaldhar@debian.org)  
Taille décompressée : 94,2k  
Dépend: perl (\>= 5.6.0-16)  
Fournit: libacme-brainfuck-perl  
Description : Embed Brainf_ck in your perl code  
Brainf_ck (yes, there is a u there.) is about the tiniest Turing-complete programming language you can get. A language is Turing-complete if it can model  
the operations of a Turing machine–an abstract model of a computer defined by the British mathematician Alan Turing in 1936. A Turing machine consists  
only of an endless sequence of memory cells and a pointer to one particular memory cell. Yet it is theoretically capable of performing any computation.  
This module will allow you to mix Brainf\*ck with your perl code.

Marqueurs: devel::lang:perl, devel::library, implemented-in::perl, role::app-data, role::devel-lib  
[/code]Donc maintenant, je laisse à un mongueur nous faire ça en une ligne (toujours ma flemme).

---

<div class="post-metadata">

**Author:** ![Yoko](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/y/58956e/32.png) [@Yoko](https://www.debian-fr.org/u/Yoko)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/5 "2016-02-20T15:53:13Z")

</div>

J’ai adoré programmer sur machine de Turing (mais sur papier helas) 😆  
Je trouve tout de même bizarre de voir du code pour Turing en procédurale. ❓

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/6 "2016-02-20T15:53:14Z")

</div>

Machine Brainfuck en Caml

[code]type mot = BD | BG | Bp | Bm | Bifnotzero | Belse | Bget | Bput;;

let rec cherche\_fi = function  
| Belse::suite -\> suite  
| \_::suite -\> cherche\_fi suite;;

let rec etape ruban\_gauche mot ruban\_droit pile instruction =  
match ruban\_gauche,mot,ruban\_droit,pile,instruction with  
| _,_,_,_,[] -\> (ruban\_gauche,mot,ruban\_droit)  
(\* décalage à droite _)  
| ,a,[],,(BD::suite) -\> etape (a::ruban\_gauche) 0 [] pile suite  
| ,a,(b::p),,(BD::suite) -\> etape (a::ruban\_gauche) b p pile suite  
(_ décalage à gauche _)  
| [],a,,,(BG::suite) -\> etape [] 0 (a::ruban\_droit) pile suite  
| (b::p),a,,,(BG::suite) -\> etape p b (a::ruban\_droit) pile suite  
(_ addition et soustraction _)  
| ,,,,(Bp::suite) -\> etape ruban\_gauche (mot+1) ruban\_droit pile suite  
| ,,,,(Bm::suite) -\> etape ruban\_gauche (mot-1) ruban\_droit pile suite  
(_ Impression _)  
| ,,,,(Bput::suite) -\> ((print\_int mot);print\_newline ();(etape ruban\_gauche mot ruban\_droit pile suite))  
(_ Lecture _)  
| ,,,,(Bget::suite) -\> etape ruban\_gauche ((print\_string “-\>”); read\_int ()) ruban\_droit pile suite  
(_ Crochet ouvrant _)  
| ,0,,,(Bifnotzero::suite) -\> etape ruban\_gauche mot ruban\_droit pile (cherche\_fi suite)  
| ,,,\_,(Bifnotzero::suite) -\> etape ruban\_gauche mot ruban\_droit (suite::pile) suite  
(_ crochet fermant \*)  
| _,0,_,_,(Belse::suite) -\> etape ruban\_gauche mot ruban\_droit (tl pile) suite  
| ,,_,_,(Belse::_) -\> etape ruban\_gauche mot ruban\_droit pile (hd pile)

;;

let transfo = function  
| `>` -\> BD  
| `<` -\> BG  
| `+` -\> Bp  
| `-` -\> Bm  
| `,` -\> Bget  
| `.` -\> Bput  
| `[` -\> Bifnotzero  
| `]` -\> Belse;;

let b\_to\_list s =  
let rec boucle l = function  
| (-1) -\> l  
| i -\> (boucle ((transfo s.[i])::l) (i-1))  
in (boucle [] ((string\_length s)-1));;

let execute pg pd s = let rbg,m,rbd = etape (tl (rev pg)) (hd (rev pg)) pd [] (b\_to\_list s) in (rev (m::rbg)),rbd;;[/code]

Un exemple:

[quote]#execute [6;7] [] “[-\>+\>+\<\<]\>\>[-\<\<+\>\>]\<”;;

- : int list \* int list = [6; 7; 7], [0]  
#[/quote]  
execute prend le ruban à gauche, à droite et le programme. Ainsi, ici, le ruban est

…,0,0,0,6,7,0,0,0… avec le pointeur sur 7 et la sortie est  
…,0,0,0,6,7,7,0,0,0… avec le pointeur sur 7 (le programme double le sommet de la «pile»). Plus simple que Perl, ça 😃

---

<div class="post-metadata">

**Author:** ![usinagaz](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/u/ecae2f/32.png) [@usinagaz](https://www.debian-fr.org/u/usinagaz)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/7 "2016-02-20T15:53:15Z")

</div>

waouah (rien compris) 😃 ça porte bien son nom ce truc là 😛

---

<div class="post-metadata">

**Author:** ![ymer](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/y/cdc98d/32.png) [@ymer](https://www.debian-fr.org/u/ymer)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/8 "2016-02-20T15:53:15Z")

</div>

C’est clair! 😒

Tu sais vraiment te servir de ça fran ??? J’avais encore jamais entendu parler de ce langage avant de lire le topic que mattotop m’a donné, où tu en parles d’ailleur.

Je crois pas avoir utilisé un seul programme codé en “brainfuck”. 😮

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/9 "2016-02-20T15:53:15Z")

</div>

c’est parceque c’est ce qu’on appelle une “preuve de concept”: un truc qui ne sert à rien d’autre qu’à montrer qu’on peut faire en vrai un truc théorique qu’on a imaginé.

---

<div class="post-metadata">

**Author:** ![Yoko](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/y/58956e/32.png) [@Yoko](https://www.debian-fr.org/u/Yoko)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/10 "2016-02-20T15:53:15Z")

</div>

Je dirais que c’est une manière de programmer comme si on était sur l’ancestrale machine de Turing juste pour le fun 😆

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/11 "2016-02-20T15:53:17Z")

</div>

Ça a également un intérêt en terme de complexité: Par exemple, pour le tri, on suppose souvent que pour une liste de longueur n, les listes sont équiprobables -chaque liste a autant de chances d’arriver qu’une autre liste- et un tri comme le tri par pivot paraît très efficace (coût en O(ln(n)) par élément trié soit O(n.ln(n))). Dans la pratique, ce tri est souvent mauvais (coût en O(n) par élément soit O(n²)) car la plupart des listes à triées sont quasiment triées d’emblée et dans ce cas, ce tri est mauvais. Si on définit le poids d’une liste comme la longueur du plus petit programme en brainfuck capable de fabriquer la liste et que la probabilité d’apparition d’une liste est inversement proportionnel à son poids, le coût du tri par pivot devient en O(n²).

Dans la pratique, pour trouver le poids d’un ensemble de données, on regarde la taille de ces données une fois compressée par gzip, c’est une excellente approximation.

Pour programmer en brainfuck, il suffit de refaire les opérations élemtaires d’une pile:

[code](\* …,A -\> …,0,A,A \*)  
let du0 = “[-\>+\>+\<\<]\>\>”;;

(\* …,0,A,A -\> …,A,A \*)  
let ho0 = “[-\<\<+\>\>]\<”;;

(\* …,A -\> …,A,A _)  
let dup = du0^ho0;;  
(_ du = “[-\>+\>+\<\<]\>\>[-\<\<+\>\>]\<” \*)

(\* …,B,A -\> …,B \*)  
let drop = “[-]\<”;;

(\* …,A,B -\> …,A,B,A \*)  
let dup2 = “\<[-\>\>+\>+\<\<\<]\>\>\>[-\<\<\<+\>\>\>]\<”;;

(\* pop \*)  
let pop = “[-]\<”;;

(\* …,A,B -\> …,B \*)  
let pop2 = “\<[-]\>[-\<+\>]\<”;;

(\* …,A,B,C -\> …,B,C \*)  
let pop3 = “\<\<[-]\>[-\<+\>]\>[-\<+\>]\<”;;

(\* …,A,B -\> …,B,A _)  
let swap = dup2^pop3;;  
(_ swap="\<[-\>\>+\>+\<\<\<]\>\>\>[-\<\<\<+\>\>\>]\<\<\<[-]\>[-\<+\>]\>[-\<+\>]\<" \*)

(\* …,A,B -\> …,A+B \*)

let sum = “[-\<+\>]\<”;;

(\* …,A,B -\> …,A\*B _)  
let mult = “\>”^"\<\<[-\>\>"^dup2^sum^"\<\<]\>\>"^pop2^pop2;;  
(_ mult = “\>\<\<[-\>\>\<[-\>\>+\>+\<\<\<]\>\>\>[-\<\<\<+\>\>\>]\<[-\<+\>]\<\<\<]\>\>\<[-]\>[-\<+\>]\<\<[-]\>[-\<+\>]\<” \*)

…  
[/code]

etc… Avec ça, en faisant comme sur une HP48 ou comme en Forth, on fait un programme très facilement. Le premier calcule factoriel et le second est la suite de Fibonacci. On peut même faire un compilateur Langage élémentaire -\> Brainfuck (ça aurait de la gueule 🙂)

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/12 "2016-02-20T15:53:17Z")

</div>

quote=“fran.b” Langage élémentaire (…)[/quote]C’est quoi ?

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/13 "2016-02-20T15:53:19Z")

</div>

> [@](#):
>
> quote=“fran.b” Langage élémentaire (…)[/quote]C’est quoi ?

Langage basique genre BASIC justement, typiquement ce qu’on utilise pour écrie un algorithme sommaire: variables, tableaux, controle de flux, c’ets tout.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/14 "2016-02-20T15:53:21Z")

</div>

Ah, ben dans ce cas, il y a les briques de transcodeur brainfuck -\> c, sur le site wikipedia, qui sont données pour la comprehension.

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 3:53 UTC](https://www.debian-fr.org/t/brainfuck/7713/15 "2016-02-20T15:53:22Z")

</div>

Oui, je m’en suis aperçu quand j’ai donné le lien. C’est étonnant parce que par réflexe, je me suis plutôt orienté sur un langage type manipulation de pile plus adapté à mon avis à une transformation en Brainfuck (leur macro to() est catastrophique en terme de longueur…)
