From d104b1fc88f9f3d6cf3e4a720bb16b40358363b3 Mon Sep 17 00:00:00 2001 From: KjetilS Date: Thu, 3 Jul 2025 15:45:27 +0200 Subject: https://theweeklychallenge.org/blog/perl-weekly-challenge-328/ --- challenge-328/kjetillll/perl/ch-1.pl | 49 ++++++++++++++++++++++++++++++++++++ challenge-328/kjetillll/perl/ch-2.pl | 16 ++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 challenge-328/kjetillll/perl/ch-1.pl create mode 100644 challenge-328/kjetillll/perl/ch-2.pl diff --git a/challenge-328/kjetillll/perl/ch-1.pl b/challenge-328/kjetillll/perl/ch-1.pl new file mode 100644 index 0000000000..a5b617eee5 --- /dev/null +++ b/challenge-328/kjetillll/perl/ch-1.pl @@ -0,0 +1,49 @@ +sub f { + local $_ = pop; + 1 while s{ + (.?) + \? + (.?) + } + { + $1 + . + ( grep /[^$1$2 ]/, 'a' .. 'z' )[0] + . + $2 + }ex; + $_; +} + + +print f("a?z") eq "abz" ? "ok" : "err", "\n"; +print f("pe?k") eq "peak" ? "ok" : "err", "\n"; +print f("gra?te") eq "grabte" ? "ok" : "err", "\n"; +print f("a?????b") eq "ababacb" ? "ok" : "err", "\n"; +print f("?a?") eq "bab" ? "ok" : "err", "\n"; +print f("?") eq "a" ? "ok" : "err", "\n"; + +__END__ + +For speedup, should it be needed, on very long inputs with many '?' chars +and/or very many inputs, initialize once an @array or a %hash and replace +this construct: + +( grep /[^$1$2 ]/, 'a' .. 'z' )[0] + +with either this: + +$array[ ord($1||'a') ][ ord($2||'a') ] + +or this: + +$array[ ord($1||'a') * 128 + ord($2||'a') ] + +or this if you prefer hashes and accept a little slower lookup than arrays: + +$hash{ $1 || 'a', $2 || 'a' } + +where the array/hash contains a possible pre-calculated letter for all +26*26=676 possible combinations of the two a-z chars before and after the '?' +and default to 'a' if the '?' are at the beginning or end of the string. + diff --git a/challenge-328/kjetillll/perl/ch-2.pl b/challenge-328/kjetillll/perl/ch-2.pl new file mode 100644 index 0000000000..fb88fd4616 --- /dev/null +++ b/challenge-328/kjetillll/perl/ch-2.pl @@ -0,0 +1,16 @@ +use v5.10; + +sub f { + state $regex_list = join '|', map { uc.lc, lc.uc } 'a' .. 'z'; #Aa|aA|Bb|bB ... Zz|zZ + my $str = shift; + 1 while $str =~ s/$regex_list//g; + $str +} + + +print f( "WeEeekly" ) eq "Weekly" ? "ok\n" : "err\n"; +print f( "abBAdD" ) eq "" ? "ok\n" : "err\n"; +print f( "abc" ) eq "abc" ? "ok\n" : "err\n"; + +#'state' instead of 'my' inits $regex_list only once even though f() is called multiple times. +#It also makes $regex_list invisible outside of sub f. Needs at least 'v5.10' for 'state' to be available. -- cgit From 8f3a919b91078399c99cdf897dad9d53f1dcd944 Mon Sep 17 00:00:00 2001 From: KjetilS Date: Thu, 3 Jul 2025 17:57:56 +0200 Subject: https://theweeklychallenge.org/blog/perl-weekly-challenge-328/ --- challenge-328/kjetillll/perl/ch-1.pl | 62 ++++++++++-------------------------- 1 file changed, 16 insertions(+), 46 deletions(-) diff --git a/challenge-328/kjetillll/perl/ch-1.pl b/challenge-328/kjetillll/perl/ch-1.pl index a5b617eee5..d0601270e7 100644 --- a/challenge-328/kjetillll/perl/ch-1.pl +++ b/challenge-328/kjetillll/perl/ch-1.pl @@ -1,49 +1,19 @@ + sub f { - local $_ = pop; - 1 while s{ - (.?) - \? - (.?) - } - { - $1 - . - ( grep /[^$1$2 ]/, 'a' .. 'z' )[0] - . - $2 - }ex; - $_; + local $_ = shift; + #idea: using negative lookbehind and negative lookahead replace ? one at a time with a, b or c until no more ? is replaced: + 1 while + s/ (? Date: Thu, 3 Jul 2025 21:26:39 +0200 Subject: https://theweeklychallenge.org/blog/perl-weekly-challenge-328/ --- challenge-328/kjetillll/perl/ch-1.pl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/challenge-328/kjetillll/perl/ch-1.pl b/challenge-328/kjetillll/perl/ch-1.pl index d0601270e7..00e456535f 100644 --- a/challenge-328/kjetillll/perl/ch-1.pl +++ b/challenge-328/kjetillll/perl/ch-1.pl @@ -9,11 +9,11 @@ sub f { $_ } -print f("a?z") eq "abz" ? "ok" : "err $f", "\n"; -print f("pe?k") eq "peak" ? "ok" : "err $f", "\n"; -print f("gra?te") eq "grabte" ? "ok" : "err $f", "\n"; -print f("a?????b") eq "ababacb" ? "ok" : "err $f", "\n"; -print f("?a?") eq "bab" ? "ok" : "err $f", "\n"; -print f("?b") eq "ab" ? "ok" : "err $f", "\n"; -print f("b???a?") eq "babcab" ? "ok" : "err $f", "\n"; -print f("?") eq "a" ? "ok" : "err $f", "\n"; +print f("a?z") eq "abz" ? "ok\n" : "err\n"; +print f("pe?k") eq "peak" ? "ok\n" : "err\n"; +print f("gra?te") eq "grabte" ? "ok\n" : "err\n"; +print f("a?????b") eq "ababacb" ? "ok\n" : "err\n"; +print f("?a?") eq "bab" ? "ok\n" : "err\n"; +print f("?b") eq "ab" ? "ok\n" : "err\n"; +print f("b???a?") eq "babcab" ? "ok\n" : "err\n"; +print f("?") eq "a" ? "ok\n" : "err\n"; -- cgit