diff options
| author | James Smith <js5@sanger.ac.uk> | 2022-12-26 01:04:00 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-26 01:04:00 +0000 |
| commit | a54797c3cd52fac11700d96f1f5daf55470b108e (patch) | |
| tree | 339da99a5274c34bc1c2ca4459177fecca2e1a85 | |
| parent | 4957df665798fbb71d337972bd6bb43a8344a51a (diff) | |
| download | perlweeklychallenge-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.pl | 34 |
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 ',', @{$_} } @_ } |
