detecter un cube abelien dans une chaine de caracteres
Le
hasni20
bonjour tt le monde,
j'ai un petit probleme en Perl, qui peut m'aider?
le voici : considerons une chaine de caractere $w, je cherche une
expression reguliere qui peut detecter si cette chaine contient un
cube abelien (avec une permutation pres des lettres), je vous donne un
exemple :
$wªa contient un cube
$w«babaca contient egalement un cube abelien abbaab
$wÊcbbaccbabba contient aussi un cube acbbaccba.
$w«abac ne contient aucune cube.
je travaille principalement sur un alphabet a 3 lettres.
Qui pourrait m'ecrire une expressions reguliere testant si $w contient
un cube abelien ou non.
je vous en remercie.
hasni.
j'ai un petit probleme en Perl, qui peut m'aider?
le voici : considerons une chaine de caractere $w, je cherche une
expression reguliere qui peut detecter si cette chaine contient un
cube abelien (avec une permutation pres des lettres), je vous donne un
exemple :
$wªa contient un cube
$w«babaca contient egalement un cube abelien abbaab
$wÊcbbaccbabba contient aussi un cube acbbaccba.
$w«abac ne contient aucune cube.
je travaille principalement sur un alphabet a 3 lettres.
Qui pourrait m'ecrire une expressions reguliere testant si $w contient
un cube abelien ou non.
je vous en remercie.
hasni.

Poser une question


Je propose une solution sans Regexp car je ne pense pas que ce soit l'outil
le plus commode dans ce cas.
La fonction testcube retourne le cube s'il existe, sinon une chaîne vide.
#!/usr/bin/perl -w
use strict;
use integer;
print testcube("abbaacabcaacbaacabacbdfgeraabb");
sub testcube {
my $w = shift;
for my $i (1..length($w)/3) { # $i = longueur du mot
for my $j (0..length($w)-3*$i) { # $j = offset dans $w
my $f1 = substr $w, $j, $i;
my $g1 = join '', sort split //, $f1;
my $f2 = substr $w, $j+$i, $i;
my $g2 = join '', sort split //, $f2;
next if $g1 ne $g2; # pas la peine d'aller plus loin
my $f3 = substr $w, $j+2*$i, $i;
my $g3 = join '', sort split //, $f3;
next if $g1 ne $g3;
return "$f1 $f2 $f3";
}
}
return "";
}
__END__
HTH
--
J-L.M.
C'est quoi un cube abélien ?
Cher Benoit,
Votre programme est pour detecter les cubes qui ne depassent pas la
longueur 3, bien que mon programme doit detecter les cube d'une
longueur quelconque.
merci.
hasni.
Bonjour,
votre methode me parrait la bonne, j'ai ecrit un programme pareil mais
qui prend trop de temps a calculer, surtout que je dois trouver et
compter toutes les chaines qui evitent les cubes, juste un exemple :
on a 2480898 chaines de longueur 14 qui evitent les cubes abeliens,
donc pour retrouver les chaines de longueur 15, l'ordinateur a eu du
mal, car j'ai procede par rajouter un a,b,c a tous les mots de
longueur 14, et relancer la procedure.
je vous en remercie egalement!!
hasni.
un cube abelien est un mot de la forme XYZ tel que le mot Y contient
les memes lettres que le mot X, et pareil pour le mot Z (il contient
egalement les memes lettres que le mot X), je precise que l'ordre des
lettres est ignore.
Hasni.