Schrift
[thread]8313[/thread]

permutation

Leser: 3


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
esskar
 2006-09-11 12:30
#69624 #69624
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi;

folgendes problem:

ich hab z.b. einen string: "foo-bar"; daraus baue ich den string: "foobar" (also einfach nur den bindstrich entfernt)

desweiteren hab ich aber auch so einen string:
"foo-bar-hutzel-putzel", draus will ich folgendes bilden:

"foobar-hutzel-putzel"
"foo-barhutzel-putzel"
"foo-bar-hutzelputzel"
"foobar-hutzelputzel"
"foobarhutzel-putzel"
"foo-barhutzelputzel"
"foobarhutzelputzel"

hat jemand ne tolle idee dafür?
vayu
 2006-09-11 12:37
#69625 #69625
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
evtl hilft dir das hier?

CPAN:Algorithm::Permute\n\n

<!--EDIT|vayu|1157963873-->
esskar
 2006-09-11 12:46
#69626 #69626
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=vayu,11.09.2006, 10:37]evtl hilft dir das hier?

CPAN:Algorithm::Permute[/quote]
ich glaube nicht; zumindest kann ich mir gerade nicht vorstellen, wie!
fraggs
 2006-09-11 12:54
#69627 #69627
User since
2006-09-11
179 Artikel
BenutzerIn
[Homepage] [default_avatar]
hmmm kann man nicht einfach per karacter nummer im string einen - einfuegen ? ich schlage mal nach im schlauen buch

edit: hmm kanns jetzt nicht finden aber ich schaue weiter
mmm twix
vayu
 2006-09-11 13:21
#69628 #69628
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
naja musst halt deinen string als array an die permute funktion übergeben, und das was bei rauskommt kannst dann wieder als string zusammen setzen.
pq
 2006-09-11 13:42
#69629 #69629
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
funktional sähe das vereinfacht so aus:
Code: (dl )
foo("foobar-hutzel-putzel") = [foo("foobarhutzel-putzel"), foo("foobar-hutzelputzel")]

also eine rekursion, die pro level genau einen bindestrich aus dem string streicht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
docsnyder
 2006-09-11 16:29
#69630 #69630
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@esskar

Ich glaube, die Leutz haben nicht so recht verstanden, was Du willst, denn mit Permutation hat das nichts zu tun.

Was Du brauchst ist:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$str = 'foo-bar-hutzel-putzel';
$len = scalar(@arr = $str =~ /-/g);
$max = (2 ** scalar(@arr)) - 1;
$pat = '^' . '([^-]*)-' x scalar(@arr) . '([^-]*)$';

for $i ( 0..$max ) {
$bits = sprintf("%03b", $i);
$subs = '';

for $j ( 0..($len-1) ) {
$subs .= '$' . ($j+1) . ((($bits >> $j) & 0x1) ? '-' : '');
}

$subs .= '$4';

eval("(\$tmp = '$str') =~ s/$pat/$subs/;");

printf("$tmp\n");
}


Das generiert die Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
foobarhutzelputzel
foo-barhutzelputzel
foobar-hutzelputzel
foo-bar-hutzelputzel
foobarhutzel-putzel
foo-barhutzel-putzel
foobar-hutzel-putzel
foo-bar-hutzel-putzel


... und das willst Du ja genau haben ;o)

Gruß, Doc\n\n

<!--EDIT|docsnyder|1157977892-->
renee
 2006-09-11 16:35
#69631 #69631
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein $len berechnest Du besser mit
Code: (dl )
$len = $str =~ tr/-//;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
docsnyder
 2006-09-11 16:43
#69632 #69632
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@renee

Oh, wie Recht Du hast: 'tr' ist in der Tat billiger als RegEx!

Gruß, Doc
esskar
 2006-09-12 10:56
#69633 #69633
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
interessante lösung
obwohl sie abe mehr als neun bindestrichen nicht mehr funktioniert; hier die etwas gecleante lösung

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $len = $str =~ tr/-//;
my $max = (2 ** $len) - 1;
my $pat = '^' . '([^-]*)-' x $len . '([^-]*)$';
       
for my $i ( 0 .. $max ) {
           
  my $bits = sprintf("%03b", $i);
                                   
  my $subs = '';
  $subs .= '$' . ($_+1) . ((($bits >> $_) & 0x1) ? '-' : '')
     for (0 .. $len-1);
  $subs .= '$'.($len+1);
           
  my $tmp;
  eval("(\$tmp = '$str') =~ s/$pat/$subs/;");
           
  push @retval, $tmp;                        
}                


gibts noch andere lösungen?\n\n

<!--EDIT|esskar|1158044216-->
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2006-09-11 12:30.