Aller au contenu

Programmation Brainfuck/Variantes

Un livre de Wikilivres.

Le langage Brainfuck a inspiré plusieurs variantes du langage en le modifiant de différentes façons :

  • Codage différent pour les 8 instructions du langage,
  • Extension du langage par ajout d'instructions,
  • ...

Le langage Ook est une variante de brainfuck, Turing-complet, conçu pour être parfaitement lisible par un orang-outan, faisant référence au personnage du bibliothécaire de l'univers du Disque-monde de Terry Pratchett. Les instructions sont celles du langage Brainfuck codées par deux onomatopées "Ook" suivies chacune par une ponctuation parmi les 3 possibles : point, point d’interrogation, point d'exclamation.

Ook Brainfuck Signification
Ook. Ook? > incrémente (augmente de 1) le pointeur.
Ook? Ook. < décrémente (diminue de 1) le pointeur.
Ook. Ook. + incrémente l'octet du tableau sur lequel est positionné le pointeur (l'octet pointé).
Ook! Ook! - décrémente l'octet pointé.
Ook! Ook. . sortie de l'octet pointé (valeur ASCII).
Ook. Ook! , entrée d'un octet dans le tableau à l'endroit où est positionné le pointeur (valeur ASCII).
Ook! Ook? [ saute à l'instruction après le Ook? Ook! correspondant si l'octet pointé est à 0.
Ook? Ook! ] retourne à l'instruction après le Ook! Ook? si l'octet pointé est différent de 0.
Ook? Ook? fin du programme.

Il y a neuf possibilités : les 8 instructions, et l'instruction supplémentaire indiquant la fin du programme.

L'exemple du Hello World codé en Ook :

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook? Ook?

Le langage f*ckf*ck[1] modifie le codage des instructions en les remplaçant par des mots de 4 lettres censurés, et permettant d'insérer des commentaires utilisant la syntaxe du langage C. Les 2ème et 3ème lettres des mots peuvent être remplacées par n'importe quel caractères ASCII.

f*ckf*ck Brainfuck Signification
f**k > incrémente (augmente de 1) le pointeur.
s**g < décrémente (diminue de 1) le pointeur.
b**b + incrémente l'octet du tableau sur lequel est positionné le pointeur (l'octet pointé).
t**s - décrémente l'octet pointé.
c**k . sortie de l'octet pointé (valeur ASCII).
k**b , entrée d'un octet dans le tableau à l'endroit où est positionné le pointeur (valeur ASCII).
a**e [ saute à l'instruction après le b**t correspondant si l'octet pointé est à 0.
b**t ] retourne à l'instruction après le a**e si l'octet pointé est différent de 0.

Signification particulière :

f*ckf*ck Signification
! Répéter la commande précédente.
/* Début de commentaire.
*/ Fin de commentaire.

Le langage spoon est équivalent au langage brainfuck mais avec des mots constitués de 0 et 1, utilisant un codage de Huffman.

Spoon Brainfuck Signification
010 > incrémente (augmente de 1) le pointeur.
011 < décrémente (diminue de 1) le pointeur.
1 + incrémente l'octet du tableau sur lequel est positionné le pointeur (l'octet pointé).
000 - décrémente l'octet pointé.
0010110 , entrée d'un octet dans le tableau à l'endroit où est positionné le pointeur (valeur ASCII).
001010 . sortie de l'octet pointé (valeur ASCII).
00100 [ saute à l'instruction après le 0011 correspondant si l'octet pointé est à 0.
0011 ] retourne à l'instruction après le 00100 si l'octet pointé est différent de 0.

Il possède deux instructions supplémentaires :

Spoon Signification
00101110 sortie de tout le tableau mémoire.
00101111 fin immédiate du programme.

Hello world en spoon :

1 1 1 1 1 1 1 1 1 1 00100 010 1 1 1 1 1 1 1 010 1 1 1 1 1 1 1 1 1 1 010 1 1 1 010 1 011 011 011 011 000 0011 010 1 1 001010 010 1 001010 1 1 1 1 1 1 1 001010 001010 1 1 1 001010 010 1 1 001010 011 011 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 001010 010 001010 1 1 1 001010 000 000 000 000 000 000 001010 000 000 000 000 000 000 000 000 001010 010 1 001010 010 001010

Les espaces peuvent être supprimés. On obtient alors un fichier binaire (exécutable) décodable sans ambiguïté :

Hello world en spoon sans espace :

11111111110010001011111110101111111111010111010101101101101100000110101100101001010010101111111001010001010111001010010110010100110111111111111111110010100100010101110010100000000000000000000010100000000000000000000000000010100101001010010001010

Le langage Segfaultprog est une variante du brainfuck, enrichie, extensible, destinée à être exécutée en machine virtuelle, sur de petites architectures (AVR, PIC, MIPS...). Son développement a débuté en mai 2010. Ce langage propose une simplification de la syntaxe du brainfuck (par exemple, avec l'adressage direct, et en évitant les répétitions), et rétro-compatibilité avec celui-ci.

Les commandes peuvent être suivie d'un argument sous la forme d'un octet (un caractère), représenté dans le tableau ci-dessous sous cette forme : argument.

Commande Description
> nb Incrémente le pointeur de nb cases.
< nb Décrémente le pointeur de nb cases.
* pos Place le pointeur à la position pos.
+ nb Incrémente l'octet pointé de nb unités.
- nb Décrémente l'octet pointé de nb unités.
[ Début de boucle, saute après le crochet fermant correspondant si l'octet pointé vaut zéro.
] Fin de boucle, retourne après le crochet ouvrant correspondant si l'octet pointé ne vaut pas zéro.
. Affiche la valeur de l'octet pointé.
, Demande la saisie de la valeur de l'octet pointé.

Les quatre dernières instructions du tableau ci-dessus correspondent exactement à celles du brainfuck. Il y a deux versions de la variante qui diffèrent pour la spécification des arguments :

SegFaultProg V1
Chaque argument est donné sous la forme d'un caractère.
SegFaultProg V2
Chaque argument est optionnel (1 par défaut) et spécifié sous l'une des deux formes suivantes :
  • Sous la forme d'un caractère, précédé de la lettre c (Caractère) ;
  • Sous la forme d'un nombre en décimal (ex : 7) ou en hexadécimal (ex : 0x2f) entre deux caractères dollar.

Hello world en SegFaultProg V1 :

*A+H.[-]+e.+7..+3.*B+32.*A+8.-8.+3.[-]+d.

Hello World en SegFaultProg V2 :

*$0x00$+cH.-$3$.+$7$..>+&+$0x03$.>+c .>+$0x57$.<<.+$3$.<.-$0x08$.

Dans le langage Whitespace[2], les instructions sont plus nombreuses que dans le langage Brainfuck. Elles sont codés par des espaces, tabulations et retour à la ligne. Le code est donc invisible dans un texte.

Pi est un langage de programmation ésotérique[3] basé sur des erreurs de chiffre du nombre pi. Les 8 instructions du brainfuck sont codées par les chiffres de 0 à 8, en sautant le chiffre de pi correspondant à la position de l'instruction.

Si le chiffre est 8 ou 9 :

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

Si le chiffre est 4 :

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

Si le chiffre est correct, il est ignoré.

Exemple : Hello world

3.1415926535897932384226433232725028841271693992751358239749
245923072164062822089986780348053431120629821483865332223366
470908446395535832317223594083284831172502841037019385311052
596446029489529303219642288009756259134461214751482337817834
652812009021456285664234613486134553226482133236073603491413
737242870066363155841744815239239622292545917053643278925902
605113301301488204625213821429519415316024320522703627595939
530921261373219226137931021185580744023794627495273518257527
348912274384830113491298346743644406563430865213349463352247
3749030217386093370277033921317659317670238267581846066440