perl logo Perl logo (Thanks to Olaf Alders)

The weekly challenge 377 - Task 2: Prefix Suffix

 1 #!/usr/bin/env perl
 2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-377/#TASK2
 3 #
 4 # Task 2: Prefix Suffix
 5 # =====================
 6 #
 7 # You are given an array of strings.
 8 #
 9 # Write a script to find if the two strings (str1, str2) in the given array
10 # such that str1 is prefix and suffix of str2. Return the total count of such
11 # pairs.
12 #
13 ## Example 1
14 ##
15 ## Input: @array = ("a", "aba", "ababa", "aa")
16 ## Output: 4
17 ##
18 ## $array[0], $array[1]: "a" is a prefix and suffix of "aba"
19 ## $array[0], $array[2]: "a" is a prefix and suffix of "ababa"
20 ## $array[0], $array[3]: "a" is a prefix and suffix of "aa"
21 ## $array[1], $array[2]: "aba" is a prefix and suffix of "ababa"
22 #
23 ## Example 2
24 ##
25 ## Input: @array = ("pa", "papa", "ma", "mama")
26 ## Output: 2
27 ##
28 ## $array[0], $array[1]: "pa" is a prefix and suffix of "papa"
29 ## $array[2], $array[3]: "ma" is a prefix and suffix of "mama"
30 #
31 ## Example 3
32 ##
33 ## Input: @array = ("abao", "ab")
34 ## Output: 0
35 #
36 ## Example 4
37 ##
38 ## Input: @array = ("abab", "abab")
39 ## Output: 1
40 ##
41 ## $array[0], $array[1]: "abab" is a prefix and suffix of "abab"
42 #
43 ## Example 5
44 ##
45 ## Input: @array = ("ab", "abab", "ababab")
46 ## Output: 3
47 ##
48 ## $array[0], $array[1]: "ab" is a prefix and suffix of "abab"
49 ## $array[0], $array[2]: "ab" is a prefix and suffix of "ababab"
50 ## $array[1], $array[2]: "abab" is a prefix and suffix of "ababab"
51 #
52 ## Example 6
53 ##
54 ## Input: @array = ("abc", "def", "ghij")
55 ## Output: 0
56 #
57 ############################################################
58 ##
59 ## discussion
60 ##
61 ############################################################
62 #
63 # Per example 4, we only want each string once, so we need to make
64 # sure we don't see any duplicates. So we walk each index in the array,
65 # making sure we don't see any duplicate (by jumping to the next element
66 # if we saw the current one already). Then we walk each index again in
67 # an inside loop, this time skipping the current element itself, and
68 # then we count this inner element if the outer element is both a
69 # prefix and a postfix of the inner one.
70 
71 use v5.36;
72 
73 prefix_suffix("a", "aba", "ababa", "aa");
74 prefix_suffix("pa", "papa", "ma", "mama");
75 prefix_suffix("abao", "ab");
76 prefix_suffix("abab", "abab");
77 prefix_suffix("ab", "abab", "ababab");
78 prefix_suffix("abc", "def", "ghij");
79 
80 sub prefix_suffix(@array) {
81     say "Input: (\"" . join("\", \"", @array) . "\)";
82     my $count = 0;
83     my $seen = {};
84     foreach my $i (0..$#array) {
85         next if $seen->{$array[$i]}++;
86         foreach my $j (0..$#array) {
87             next if $i == $j;
88             $count++ if $array[$j] =~ m/^$array[$i]/ && $array[$j] =~ m/$array[$i]$/;
89         }
90     }
91     say "Output: $count";
92 }