Décomposition et assemblage de chaines par itération avec ET et OU
Bonjour à tous,
Je cherche à décomposer puis à recomposer des chaines de caractères en itérant l'ensemble.
Au départ j'ai une chaîne complexe exemple :
Citation:
%tata%~%tutu%_%toto%~%titi%
La chaîne est forcément composé au minimum d'un seul %element%
La séparation ~ représente un OU et la séparation _ représente un ET
Je souhaite décomposer la chaîne de base pour la recomposer comme ceci :
Citation:
%tata%~%tutu%_%toto%~%titi%
Donne :
Citation:
%tata%_%toto%
%tata%_%titi%
%tutu%_%toto%
%tutu%_%titi%
J'ai essayé plusieurs idées sans succès.
Principalement des boucles FOR ou WHILE avec un système de compteurs, mais je me perds vite dans la descente des enfants.
J'essaye d'éviter la récursivité, j'aurais aime uniquement de l'itératif si cela est possible.
Mon principe au départ étant de spliter les ET puis d'itérer le résultat et de spliter les et d'enchainer l'itération mais la c'est l'anarchie :calim2:
A savoir qu'il n'y a pas nécessairement de ET ou de OU, on peut avoir :
Citation:
%tata%~%tutu%_%titi%
Citation:
%tata%~%tutu%_%toto%
Citation:
%tata%~%tutu%_%toto%~%titi%
Je me limite à deux OU et un ET pour le moment, le temps déjà d'arriver à traiter :D
Merci d'avance pour votre aide sur l'algo ;)
Décomposition et assemblage de chaines par itération avec ET et OU
Bonjour, :D
Je crois que l'absence de parenthèses - déjà pointée par Flodelarab - constitue dès le départ un obstacle insurmontable, parce qu'elle exclut toute transformation de la chaîne.
La décomposition en éléments simples que tu évoques
Citation:
Envoyé par
cerede2000
... Je souhaite décomposer la chaîne de base pour la recomposer comme ceci :
%tata%~%tutu%_%toto%~%titi%
Donne :
%tata%_%toto%
%tata%_%titi%
%tutu%_%toto%
%tutu%_%titi%
J'ai essayé plusieurs idées sans succès ...
suppose implicitement la distributivité du 'ET' (_) sur le 'OU' (~), et que l'on parte obligatoirement de l'expression (abrégée pour une meilleure lisibilité)
(A~B)_(C~D) = (A_C)~(A_D)~(B_C)~(B_D) = A_C~A_D~B_C~B_D
compte tenu de la préséance du premier opérateur (_) sur le second.
Pour la même raison, la chaîne initialement proposée %tata%~%tutu%_%toto%~%titi% ne permet qu'une seule interprétation:
%tata%~(%tutu%_%toto%)~%titi% ,
et ne peut être ni décomposée, ni simplifiée.
Plus grave encore, l'absence de parenthèses exclut une expression telle que (A~B)_C ,
la séquence de trois termes A~B_C ne pouvant conduire qu'à A~(B_C) .
Décomposition et assemblage de chaines par itération avec ET et OU
Citation:
Envoyé par
Flodelarab
La noyade sera totale quand on rappellera que le OU est aussi distributif sur le ET que le ET sur le OU. :lol:
a+bc=(a+b)(a+c)
Là, je me sens en train de perdre pied :help: (AetB)ou(CetD) = (AouC)et(AouD)et(BouC)et(BouD) ?
Soit encore, pour tenter de ne pas boire la tasse:
(A*B)+(C*D) = (A+C)*(A+D)*(B+C)*(B+D) et comme il n'est pas question de lutter contre le courant
= ((A+C)*(A+D))*((B+C)*(B+D)) = (A*A+A*D+C*A+C*D)*(B*B+B*D+C*B+C*D) = ... A-t-on alerté les secouristes ?
Décomposition et assemblage de chaines par itération avec ET et OU
1°) Cela paraît conforme aux règles du calcul algébrique, avec la correspondance déjà repérée: '~' = 'OU' = '+' ; '_' = 'ET' = '*' :
Citation:
Envoyé par
cerede2000
... %truc%_%bidule%~%machin%_%muche% donne donc :
%truc%
ET
%bidule%~%machin%
ET
%muche%
Puis :
%truc%
ET
%bidule% OU %machin%
ET
%muche%
Ce qui au final est attendu :
%truc% ET %bidule% ET %muche%
OU
%truc% ET %machin% ET %muche% ...
Cependant l'augmentation du nombre de termes (qui passe de 4 à 6) implique l'action simultanée d'un opérateur sur plusieurs termes et sa distributivité, donc la présence implicite d'une paire de parenthèses délimitant un groupe d'au moins deux termes: la traduction simple de ce qui précède donne:
A*(B+C)*D = A*B*D + A*C*D .
2°) La représentation des opérateurs est en effet sans conséquence:
Citation:
Envoyé par
cerede2000
... Je ne peux tout simplement pas utiliser de + et de * car les chaines peuvent en contenir... malheureusement !
Alors qu'il n'y aura pas de ~ et de _
Pour la question de parenthèses en effet, mais je m'en passe avec un moyen simple, c'est que le traitement des chaines sera fait via une regex.
Celle-ci capture d'abord les ET (_) pour ensuite appliquer la distribution des OU (~) ...
Mais c'est bien ici l'épineuse question: ta démarche a pratiquement pour effet d'imposer la préséance du 'OU' = '~' sur l'autre opérateur, contrairement à ce que tu en dis - ou ce que je crois en comprendre.
Je n'ai rien à priori contre un développement de chaînes de caractères, selon des règles arbitraires; mais cela ne me paraît pas clair.
Qu'obtiendra-t-on par exemple pour: A*B+C*D+E*F , ou: A*B+C+D*E ?
Et quelle est la difficulté que tu rencontres ?