Thread String in Sequenzen gleicher Zeichen zerlegen: mit Regex (10 answers)
Opened by pKai at 2005-11-28 15:42

pKai
 2005-11-29 11:35
#60488 #60488
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use strict;
use warnings;
use Benchmark qw(:all);

my $s = 'xx55111111116jkwhcxxxxx';

sub test1 {
my $r;
my $r0;
my @R;
for my $c (split '', $s) {
unless (defined $r) {
$r = $c;
$r0 = $c;
} elsif($c eq $r0) {
$r .= $c;
} else {
push @R, $r;
$r = $c;
$r0 = $c;
}
}
push @R, $r if length $r;
@R;
}

sub test2 {
keys %{{$s =~ /((.)\2*)/g}}
}

sub test3 {
my @x = $s =~ m/((.)\2*)/g;
map $x[2*$_], 0..@x/2-1;
}

cmpthese (-20,
{
for => \&test1,
pKai => \&test2,
murphy => \&test3,
}
);

Code: (dl )
1
2
3
4
         Rate    for murphy   pKai
for 5172/s -- -12% -27%
murphy 5866/s 13% -- -18%
pKai 7123/s 38% 21% --


wobei "pKai" ausser Konkurrenz läuft, da der Hash-Trick nur klappt, wenn keine Sequenz mehrfach auftaucht und ausserdem die Reihenfolge nicht erhalten bleiben muss.

Die sub test1 hab ich mal naiv geschrieben, wie ich mir dachte, dass Perl das fix abarbeiten kann. Ging aber wohl in die Hose. Abgesehen davon, dass ich diese sub mitnichten verständlicher finden als murphys. Falls es eine einfachere (schnellere?) Version mit for gibt, interessiert mich das natürlich ;)
I sense a soul in search of answers.

View full thread String in Sequenzen gleicher Zeichen zerlegen: mit Regex