#!/usr/bin/env perl -l use warnings; use strict; use Benchmark qw/timethese cmpthese/; use Test::More; my @az = ('a'..'z', 'A'..'Z', '1'..'9'); # note: if '0' is in your alphabet, chop() will fail my @golden_original; my $N = 2000; for( 1 .. $N ) { push @golden_original, join '', (map { $az[rand @az] } 1..$N-5), '0'x5; } #print length($str), qq(\t"$str"); #print scalar @golden_original; #diag explain org => \@golden_original; my $wcf = [with_chop_fixed(@golden_original)]; #diag explain wcf => $wcf; my $wch = [with_chop (@golden_original)]; #diag explain wch => $wch; my $wsp = [with_split (@golden_original)]; #diag explain wsp => $wsp; my $wsu = [with_substr (@golden_original)]; #diag explain wsu => $wsu; my $wuk = [buk_substr (@golden_original)]; #diag explain wuk => $wuk; my $wam = [anomalous_map (@golden_original)]; #diag explain wam => $wam; my $wa2 = [anomalous_two (@golden_original)]; #diag explain wa2 => $wa2; is_deeply( $wch, $wsp, 'your chop vs split'); is_deeply( $wcf, $wsp, 'my chop vs split'); is_deeply( $wsu, $wsp, 'substr vs split'); is_deeply( $wuk, $wsp, 'BrowserUK\'s substr vs split'); is_deeply( $wam, $wsp, 'AnomalousMonk\'s map vs split'); is_deeply( $wa2, $wsp, 'AnomalousMonk\'s second vs split'); sub with_split { my @original = @_; my @transposed; for( @original ) { my $i = 0; $transposed[$i++] .= $_ for split //; } return @transposed; } sub with_chop { my @original = @_; my @transposed; for( map $_ = reverse, @original ){ my $i = 0; $transposed[ $i ++ ] .= chop while $_; } return @transposed; } sub with_chop_fixed { my @original = @_; my @transposed; for( map $_ = reverse, @original ){ my $i = 0; $transposed[ $i ++ ] .= chop while length $_; } return @transposed; } sub with_substr { my @original = @_; my $w = scalar @original; my @transposed = ( ' 'x$w ) x $w; for my $i ( 0 .. $#original ) { for my $j ( 0 .. $i ) { substr($transposed[$i], $j, 1) = substr($original[$j], $i, 1); substr($transposed[$j], $i, 1) = substr($original[$i], $j, 1); } } return @transposed; } sub buk_substr { # https://perlmonks.org/?node_id=1208297 my @in = @_; my @out; for my $i (0 .. length( $in[0] ) - 1 ) { push @out, join '', map substr( $_,$i,1 ), @in; } return @out; } sub anomalous_map { # https://perlmonks.org/?node_id=1208294, but modified for my length $_ fix... my @orig = @_; my @transposed; for (map scalar(reverse), @orig) { my $i = 0; $transposed[ $i ++ ] .= chop while length $_; } return @transposed; } sub anomalous_two { # [id://1208340] my $ar_matrix = [@_]; my $r_all = reverse @$ar_matrix; my $i_max = @$ar_matrix && length($ar_matrix->[0]) - 1; my @transposed; $#transposed = $i_max - 1; for( 0 .. $#$ar_matrix ) { for( 0 .. $i_max) { $transposed[$_] .= chop $r_all; } } return @transposed; } my $r = timethese( -15, { with_substr => sub { with_substr ( @golden_original ); }, with_split => sub { with_split ( @golden_original ); }, with_chop_fixed => sub { with_chop_fixed ( @golden_original ); }, buk_substr => sub { buk_substr ( @golden_original ); }, anomalous_map => sub { anomalous_map ( @golden_original ); }, anomalous_two => sub { anomalous_two ( @golden_original ); }, }); cmpthese $r; done_testing();