aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-04-18 20:43:56 +0100
committerGitHub <noreply@github.com>2025-04-18 20:43:56 +0100
commit2aa8dbcec35ce2a86666be0840fb8a767d21656c (patch)
tree73e38da5191cf49356567d76aae1fdfaf9f08d93
parent81a1a66e3133bb1f48cff3d28258457d64c047ce (diff)
parent2825f6fc6f3eda335737b806d6ec5eafb18391de (diff)
downloadperlweeklychallenge-club-2aa8dbcec35ce2a86666be0840fb8a767d21656c.tar.gz
perlweeklychallenge-club-2aa8dbcec35ce2a86666be0840fb8a767d21656c.tar.bz2
perlweeklychallenge-club-2aa8dbcec35ce2a86666be0840fb8a767d21656c.zip
Merge pull request #11893 from kjetillll/challenge-317-kjetillll
https://theweeklychallenge.org/blog/perl-weekly-challenge-317/
-rw-r--r--challenge-317/kjetillll/perl/ch-1.pl5
-rw-r--r--challenge-317/kjetillll/perl/ch-2.pl54
2 files changed, 59 insertions, 0 deletions
diff --git a/challenge-317/kjetillll/perl/ch-1.pl b/challenge-317/kjetillll/perl/ch-1.pl
new file mode 100644
index 0000000000..155de6d12f
--- /dev/null
+++ b/challenge-317/kjetillll/perl/ch-1.pl
@@ -0,0 +1,5 @@
+sub f { pop() eq join('', map substr($_,0,1), @_) }
+
+print f( "Perl", "Weekly", "Challenge", "PWC" ) ? "ok\n" : "error\n"; #true
+print f( "Bob", "Charlie", "Joe", "BCJ" ) ? "ok\n" : "error\n"; #true
+print f( "Morning", "Good", "MM" ) ? "error\n" : "ok\n"; #false
diff --git a/challenge-317/kjetillll/perl/ch-2.pl b/challenge-317/kjetillll/perl/ch-2.pl
new file mode 100644
index 0000000000..4360f6b2e4
--- /dev/null
+++ b/challenge-317/kjetillll/perl/ch-2.pl
@@ -0,0 +1,54 @@
+sub f { join( '', sort split//, pop ) eq
+ join( '', sort split//, pop ) }
+
+print f( "desc", "dsec" ) ? "ok\n" : "error\n"; # true
+print f( "duck", "dcuk" ) ? "ok\n" : "error\n"; # true
+print f( "poo", "eop" ) ? "error\n" : "ok\n"; # false
+print f( "stripe", "sprite" ) ? "ok\n" : "error\n"; # true
+
+
+=pod
+
+For long inputs the sorting in sub f is sub-optimal.
+
+Sorting makes this a O( n * log n ) solution.
+
+For long inputs a faster solution in linear time: O( n ) is counting the
+frequency of each letter and then compare the counts like in sub f2 below.
+
+The break even according to the benchmarks at the bottom are around 100 chars.
+When the strings become longer than that the sub f2 without sorting becomes
+faster. And much faster for very long inputs.
+
+=cut
+
+sub f2 {
+ my %freq1; $freq1{$_}++ for split//, shift;
+ my %freq2; $freq2{$_}++ for split//, shift;
+ return 0 if 0+keys(%freq1) != 0+keys(%freq2);
+ for( keys %freq1 ){
+ return 0 if $freq1{$_} != $freq2{$_};
+ }
+ return 1
+}
+
+print f2( "desc", "dsec" ) ? "ok\n" : "error\n"; # true
+print f2( "duck", "dcuk" ) ? "ok\n" : "error\n"; # true
+print f2( "poo", "eop" ) ? "error\n" : "ok\n"; # false
+print f2( "stripe", "sprite" ) ? "ok\n" : "error\n"; # true
+
+
+
+use Benchmark;
+use List::Util 'shuffle';
+for my $len ( 10, 30, 100, 300, 1e3, 1e4, 1e5, 1e6 ){
+ print "---------- len: $len\n";
+ my $a = join '', map ['a'..'z']->[rand(26)], 1 .. $len;
+ my $b = join '', shuffle split //, $a;
+ my $count = 3e6 / $len;
+ $count = 5 if $count < 5;
+ timethese($count, {
+ 'f' => sub { f($a,$b) ? 1 : die },
+ 'f2' => sub { f2($a,$b) ? 1 : die },
+ });
+}