aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Smith <js5@sanger.ac.uk>2022-12-26 01:04:00 +0000
committerGitHub <noreply@github.com>2022-12-26 01:04:00 +0000
commita54797c3cd52fac11700d96f1f5daf55470b108e (patch)
tree339da99a5274c34bc1c2ca4459177fecca2e1a85
parent4957df665798fbb71d337972bd6bb43a8344a51a (diff)
downloadperlweeklychallenge-club-a54797c3cd52fac11700d96f1f5daf55470b108e.tar.gz
perlweeklychallenge-club-a54797c3cd52fac11700d96f1f5daf55470b108e.tar.bz2
perlweeklychallenge-club-a54797c3cd52fac11700d96f1f5daf55470b108e.zip
Update ch-2.pl
-rw-r--r--challenge-196/james-smith/perl/ch-2.pl34
1 files changed, 28 insertions, 6 deletions
diff --git a/challenge-196/james-smith/perl/ch-2.pl b/challenge-196/james-smith/perl/ch-2.pl
index b376f4322d..2ba3bacf88 100644
--- a/challenge-196/james-smith/perl/ch-2.pl
+++ b/challenge-196/james-smith/perl/ch-2.pl
@@ -13,10 +13,31 @@ my @TESTS = (
[ [1,3,5], '( )' ],
);
-is( dmp( range( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
-is( dmp( range_v2( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
+is( dmp( range_v2( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
+is( dmp( range_map( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
+is( dmp( range( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
+is( dmp( range_for( @{$_->[0]} ) ), $_->[1] ) for @TESTS;
+
done_testing();
+cmpthese( -3, {
+ 2 => sub { range_v2( @{$_->[0]} ) for @TESTS },
+ 3 => sub { range_map( @{$_->[0]} ) for @TESTS },
+ 1 => sub { range( @{$_->[0]} ) for @TESTS },
+ 4 => sub { range_for( @{$_->[0]} ) for @TESTS },
+} );
+
+sub range_v2 {
+ my @r=[(shift)x 2];
+ $_==$r[-1][1]+1 ? $r[-1][1]=$_ : push @r,[$_,$_] for @_;
+ grep { $_->[1] != $_->[0] } @r;
+}
+
+sub range_map {
+ my $e = my $s = shift;
+ map { $_==$e+1 ? ($e = $_)x 0 :( $e-$s ? [$s,$e] : (), ($s=$e=$_)x 0 ) } @_,0;
+}
+
sub range {
my $s = my $e = shift, my @r;
($_[0]==$e+1) ? ( $e=shift ) : ( $s==$e || push(@r,[$s,$e]) , $e=$s=shift ) while @_;
@@ -24,10 +45,11 @@ sub range {
@r
}
-sub range_v2 {
- my @r = [ (shift) x 2 ];
- $_ == $r[-1][1] + 1 ? $r[-1][1] = $_ : push @r, [$_,$_] for @_;
- grep { $_->[1]-$_->[0] } @r
+sub range_for {
+ my $s = my $e = shift, my @r;
+ ($_==$e+1) ? $e++ : ( $s==$e || push(@r,[$s,$e]) , $e=$s=$_ ) for @_;
+ push @r, [$s,$e] unless $s==$e;
+ @r
}
sub dmp { sprintf '( %s )', join ', ', map { sprintf '[%s]', join ',', @{$_} } @_ }