Perl Weekly Challenge 239.

My solutions (task 1 and task 2 ) to the The Weekly Challenge - 239.

Task 1: Same String

``````Submitted by: Mohammad S Anwar
You are given two arrays of strings.

Write a script to find out if the word created by concatenating the array elements is the same.

Example 1
Input: @arr1 = ("ab", "c")
@arr2 = ("a", "bc")
Output: true

Using @arr1, word1 => "ab" . "c" => "abc"
Using @arr2, word2 => "a" . "bc" => "abc"
Example 2
Input: @arr1 = ("ab", "c")
@arr2 = ("ac", "b")
Output: false

Using @arr1, word1 => "ab" . "c" => "abc"
Using @arr2, word2 => "ac" . "b" => "acb"
Example 3
Input: @arr1 = ("ab", "cd", "e")
@arr2 = ("abcde")
Output: true

Using @arr1, word1 => "ab" . "cd" . "e" => "abcde"
Using @arr2, word2 => "abcde"
``````

I input each array as a space separated string. The trivial solution would be then to remove the spaces and compare the results, but as it seems like cheating, I first split them into two arrays, then join them and compare. The result is a simple one-liner.

Example 1:

``````perl -E '
@x=split " ", shift; @y=split " ", shift; say "(@x), (@y) -> ", (join "", @x) eq (join "",@y)?"True":"False"
' "ab c" "a bc"
``````

Results:

``````(ab c), (a bc) -> True
``````

Example 2:

``````perl -E '
@x=split " ", shift; @y=split " ", shift; say "(@x), (@y) -> ", (join "", @x) eq (join "",@y)?"True":"False"
' "ab c" "ac b"
``````

Results:

``````(ab c), (ac b) -> False
``````

Example 3:

``````perl -E '
@x=split " ", shift; @y=split " ", shift; say "(@x), (@y) -> ", (join "", @x) eq (join "",@y)?"True":"False"
' "ab cd e" "abcde"
``````

Results:

``````(ab cd e), (abcde) -> True
``````

The full code is similar.

`````` 1  # Perl weekly challenge 239
2  # Task 1:  Same String
3  #
4  # See https://wlmb.github.io/2023/10/15/PWC239/#task-1-same-string
5  use v5.36;
6  die <<~"FIN" unless @ARGV==2;
7      Usage: \$0 AR1 AR2
8      to check if the space separated lists of strings ARn concatenate
9      to the same string.
10      FIN
11  my @ar1=split " ", shift;
12  my @ar2=split " ", shift;
13  say "(@ar1), (@ar2) -> ", (join "", @ar1) eq (join "",@ar2)?"True":"False"
``````

Examples:

``````./ch-1.pl "ab c" "a bc"
./ch-1.pl "ab c" "ac b"
./ch-1.pl "ab cd e" "abcde"
``````

Results:

``````(ab c), (a bc) -> True
(ab c), (ac b) -> False
(ab cd e), (abcde) -> True
``````

Task 2: Consistent Strings

``````Submitted by: Mohammad S Anwar
You are given an array of strings and allowed string having distinct characters.

A string is consistent if all characters in the string appear in the string allowed.

Write a script to return the number of consistent strings in the given array.

Example 1
Input: @str = ("ad", "bd", "aaab", "baa", "badab")
\$allowed = "ab"
Output: 2

Strings "aaab" and "baa" are consistent since they only contain characters 'a' and 'b'.
Example 2
Input: @str = ("a", "b", "c", "ab", "ac", "bc", "abc")
\$allowed = "abc"
Output: 7
Example 3
Input: @str = ("cc", "acd", "b", "ba", "bac", "bad", "ac", "d")
Output: 4

Strings "cc", "acd", "ac", and "d" are consistent.
``````

To solve this task I make a hash of allowed characters and use it to check all characters of all strings. I assume the first input in @ARGV is the allowed string and the rest are the strings to test. I assume upper and lower case letters differ. With `all` from `List::Util` the code fits a one-liner.

Example 1:

``````perl -MList::Util=all -E '
map{\$x{\$_}++} split "", \$x=shift; @o=grep{all {\$x{\$_}} split ""}@ARGV; say "\$x: @ARGV -> ",0+@o;
' ab ad bd aaab baa badab
``````

Results:

``````ab: ad bd aaab baa badab -> 2
``````

Example 2:

``````perl -MList::Util=all -E '
map{\$x{\$_}++} split "", \$x=shift; @o=grep{all {\$x{\$_}} split ""}@ARGV; say "\$x: @ARGV -> ",0+@o;
' abc a b c ab ac bc abc
``````

Results:

``````abc: a b c ab ac bc abc -> 7
``````

Example 3:

``````perl -MList::Util=all -E '
map{\$x{\$_}++} split "", \$x=shift; @o=grep{all {\$x{\$_}} split ""}@ARGV; say "\$x: @ARGV -> ",0+@o;
' cad cc acd b ba bac bad ac d
``````

Results:

``````cad: cc acd b ba bac bad ac d -> 4
``````

The full code is similar:

`````` 1  # Perl weekly challenge 239
2  # Task 2:  Consistent Strings
3  #
4  # See https://wlmb.github.io/2023/10/15/PWC239/#task-2-consistent-strings
5  use v5.36;
6  use List::Util qw(all);
7  die <<~"FIN" unless @ARGV;
8      Usage: \$0 A S1 [S2...]
9      Count how many of the strings Sn are consistent with the allowed characters in string A.
10      FIN
11  my \$allowed=shift;
12  my %allowed;
13  map {\$allowed{\$_}++} split "", \$allowed;
14  my @output = grep{all {\$allowed{\$_}} split ""} @ARGV;
15  say "Allowed: \$allowed. Strings: @ARGV -> ",0+@output;
``````

Examples:

``````./ch-2.pl ab ad bd aaab baa badab
./ch-2.pl abc a b c ab ac bc abc
./ch-2.pl cad cc acd b ba bac bad ac d
``````

Results:

``````Allowed: ab. Strings: ad bd aaab baa badab -> 2
Allowed: abc. Strings: a b c ab ac bc abc -> 7
Allowed: cad. Strings: cc acd b ba bac bad ac d -> 4
``````
Written on October 15, 2023