
Forum dédié aux énigmes et à toutes formes de jeux de logique. | Déconnexion |
|
Tu n'es pas identifié sur Prise2tete : s'identifier. Accueil
Forum
|
![]() |
Écrire une réponseRésumé de la discussion
Et voilà une version commentée. il s'agit en fait d'une calculatrice en BF... 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
Je déterre un vieux sujet, mais bon: en faisant de la place sur mon disque, j'ai retrouvé ça: 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
J'ai trouvé un super tuto (en anglais mais très compréhensible car très visuel) pour Code:+++++ +++
[
> +++++ ++
> ++++
> +
>
++++
[
> +++++ +++
< -
]
>>>>
> +++++ +
> +++++ ++
>>>
> +++++ +
> +++++ ++
>>>
> +++++ +
> +++++ ++
<<<<< <<<<< <<<<< <<<<< -
]
> ++
>> ++
>>
>>>>> ++
>>>>> ++
>>>>> ++
<<<<< <<<<< <<<<< <<<<<
>>>>> >
+
[
-
>>> .
>>>>> .
>>>>> .
<<<<< <<<<< <<<<< <<<
.
> .
>> .
< .
>>>>> >>>>> >>>>> >
+
[
-
>-
>>>+
<<<<
]
>>+
<
[
>-
]
>
[
>
]
>
[
<<<+
<+
>>>>-
]
<<<<
>>
[
<< ----- -----
<<<<< +
>>>>> >> -
]
<<
<<<<<
[
-
>-
>>>+
<<<<
]
>>+
<
[
>-
]
>
[
>
]
>
[
<<<+
<+
>>>>-
]
<<<<
>>
[
<< ----- -----
<<<<< +
>>>>> >> -
]
<<
<<<<< <<<<<
+
[
-
>-
>>>+
<<<<
]
>>+
<
[
>-
]
>
[
>
]
>
[
<<<+
<+
>>>>-
]
<<<<
>>
[
> +
< -
]
+
>
[
< -
> -
]
<
]Je vous conseille ce super interpréteur de BF : Ici Code:1)++++++++++ 2)[ 3) >++++++++>++++++<<- 4)] 5)>. 6)>+++++. 7)<++. 8)>+++. 9)<---. 10)-. Explications : |
![]() |
| Prise2Tete Forum Statistiques Liste des membres Hall of Fame Contact | ||