aboutsummaryrefslogtreecommitdiff
path: root/challenge-265
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-265')
-rw-r--r--challenge-265/laurent-rosenfeld/blog1.txt1
-rw-r--r--challenge-265/laurent-rosenfeld/perl/ch-2.pl28
-rw-r--r--challenge-265/laurent-rosenfeld/raku/ch-2.raku16
3 files changed, 45 insertions, 0 deletions
diff --git a/challenge-265/laurent-rosenfeld/blog1.txt b/challenge-265/laurent-rosenfeld/blog1.txt
new file mode 100644
index 0000000000..d818b637e6
--- /dev/null
+++ b/challenge-265/laurent-rosenfeld/blog1.txt
@@ -0,0 +1 @@
+https://blogs.perl.org/users/laurent_r/2024/04/perl-weekly-challenge-265-completing-word.html
diff --git a/challenge-265/laurent-rosenfeld/perl/ch-2.pl b/challenge-265/laurent-rosenfeld/perl/ch-2.pl
new file mode 100644
index 0000000000..c52d1045c0
--- /dev/null
+++ b/challenge-265/laurent-rosenfeld/perl/ch-2.pl
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+use feature 'say';
+
+sub complete_word {
+ my ($in_str, @in_words) = @_;
+ my %letters;
+ $letters{$_}++ for grep { $_ =~ /[a-z]/ } map { lc } split //, $in_str;
+ my @result;
+ WORD: for my $word (@in_words) {
+ my %word_let;
+ $word_let{$_}++ for map { lc } split //, $word;
+ for my $k (keys %letters) {
+ next WORD unless exists $word_let{$k};
+ next WORD if $letters{$k} > $word_let{$k};
+ }
+ push @result, $word;
+ }
+ return (sort {length $a <=> length $b} @result)[0];
+}
+
+my @tests = ( ['aBc 11c', ['accbbb', 'abc', 'abbc']],
+ ['Da2 abc', ['abcm', 'baacd', 'abaadc']],
+ ['JB 007', ['jj', 'bb', 'bjb']] );
+for my $test (@tests) {
+ printf "%-8s - %-10s => ", $test->[0], "$test->[1][0] ...";
+ say complete_word $test->[0], @{$test->[1]};
+}
diff --git a/challenge-265/laurent-rosenfeld/raku/ch-2.raku b/challenge-265/laurent-rosenfeld/raku/ch-2.raku
new file mode 100644
index 0000000000..9b171623fa
--- /dev/null
+++ b/challenge-265/laurent-rosenfeld/raku/ch-2.raku
@@ -0,0 +1,16 @@
+sub complete-word ($in-str, @in-words) {
+ my $letters = $in-str.comb.map({ .lc}).grep( /<[a..z]>/).Bag;
+ my @result;
+ for @in-words -> $word {
+ push @result, $word if $letters ⊆ $word.comb.map({ .lc }).Bag;
+ }
+ return min(@result, :by( { $_.chars } ));
+}
+
+my @tests = ('aBc 11c', ('accbbb', 'abc', 'abbc')),
+ ('Da2 abc', ('abcm', 'baacd', 'abaadc')),
+ ('JB 007', ('jj', 'bb', 'bjb'));
+for @tests -> @test {
+ printf "%-8s - %-20s => ", @test[0], "@test[1]";
+ say complete-word @test[0], @test[1];
+}