Parlons binaire mais parlons bien
Il y a une petite quatorzaine de mois, Gordontesos publiait sur son blog l’article Parlons binaire mais parlons bien accompagné d’une implémentation en PHP.
Cette idée mérite d’être une reprise, accompagnée d’une implémentation en brainfuck.
Principe
Si jamais vous n’avez pas envie de lire l’article original, voici un résumé.
ASCII
En informatique, un moyen de représenter des caractères est d’utiliser la table ASCII. Chaque caractère de la table est codé sur 7 bits, mais comme on préfère les octets, on accole un 8ème bit de valeur nulle en poids fort.
L’idée du programme est de visualiser un peu mieux cette représentation en convertissant un message en blocs de huit « 0 » ou « 1 » séparés par des espaces, chaque bloc donnant la représentation binaire du caractère considéré, suivant l’ASCII.
Il est également intéressant de faire l’opération inverse.
UTF-8
Se limiter aux caractères ASCII n’est pas très amusant. C’est pourquoi on a créé le code UTF-8 : on passe de 95 caractères affichables à plusieurs millions.
Quand on compare ASCII et UTF-8, on peut remarquer également deux choses : - tout caractère ASCII est codé de la même manière en UTF-8 (rétro-compatibilité) ; - un caractère UTF-8 peut être codé sur plus d’un octet.
Pour notre programme, le principe reste inchangé : il s’agit de transformer un message en UTF-8 en blocs de huit « 0 » ou « 1 » séparés par des espaces, et vice-versa. La seule différence notable est qu’un tel bloc ne représente plus nécessairement un seul caractère UTF-8.
Implémentation en brainfuck
Les programmes suivants fonctionnent pour des messages uniquement composés de caractères ASCII, mais marchent également avec certains interpréteurs brainfuck pour les messages en UTF-8.
Ils respectent également les règles de programmation en brainfuck que je me suis fixées.
Codage en binaire
230 caractères ; 15 cases mémoires sont nécessaires.
++++++++ [->+++++ +<]>>>>> >>>>>>>>
>+<<<<<< <<<<,--- -------[ ++++++++
++[[-<+> [-<->>+< [->>+<<] ]>>[-<<+
>>]<<]>] >+[>[<-> -]<[->+< ]>]+<<<<
<<<<<<<< <[->+>+> +>+>+>+> +>+>+>+<
<<<<<<<< <]>[-<+> ]>[>]<-- --------
------[. [-]<]>>, -------- --]+++++
+++++.
Décodage en ASCII ou UTF-8
239 caractères ; 9 cases mémoires sont nécessaires.
En entrée, les caractères autres que « 0 » et « 1 » sont ignorés, sauf le retour à la ligne pour terminer le programme.
+++++[>+ +++++++> >++<<<-] >->>-->,
-------- --[<<<[- >+>>>+<< <<]>[-<+
>]>>[>>+ <[-<->>- ]>[-<<[- ]>[-]++>
>]<<<]+> >+<[-<-> [>-<[-]] ]>[->>[-
<+>]<[-> ++<]<<<[ ->>>>+<< <<]<-[->
>+<<]>>[ -<+<+>>] +<[[-]>- <]>[->>>
.[-]<<<< <+++++++ +>>]>]<< ,-------
---]++++ ++++++.
Conclusion
Vous conviendrez comme moi que mon implémentation est beaucoup plus simple que celle de Gordontesos : code source très court, pas de fioritures au niveau de l’interface utilisateur, besoins en mémoire connus et limités.
Une fois de plus, brainfuck montre toute sa puissance !