perl logo Perl logo (Thanks to Olaf Alders)

The weekly challenge 353 - Task 2: Validate Coupon

  1 #!/usr/bin/env perl
  2 # https://theweeklychallenge.org/blog/perl-weekly-challenge-353/#TASK2
  3 #
  4 # Task 2: Validate Coupon
  5 # =======================
  6 #
  7 # You are given three arrays, @codes, @names and @status.
  8 #
  9 # Write a script to validate codes in the given array.
 10 #
 11 # A code is valid when the following conditions are true:
 12 # - codes[i] is non-empty and consists only of alphanumeric characters (a-z,
 13 #   A-Z, 0-9) and underscores (_).
 14 # - names[i] is one of the following four categories: "electronics", "grocery",
 15 #    "pharmacy", "restaurant".
 16 # - status[i] is true.
 17 #
 18 # Return an array of booleans indicating validity: output[i] is true if and
 19 # only if codes[i], names[i] and status[i] are all valid.
 20 #
 21 ## Example 1
 22 ##
 23 ## Input: @codes  = ("A123", "B_456", "C789", "D@1", "E123")
 24 ##        @names  = ("electronics", "restaurant", "electronics", "pharmacy", "grocery")
 25 ##        @status = ("true", "false", "true", "true", "true")
 26 ## Output: (true, false, true, false, true)
 27 #
 28 #
 29 ## Example 2
 30 ##
 31 ## Input: @codes  = ("Z_9", "AB_12", "G01", "X99", "test")
 32 ##        @names  = ("pharmacy", "electronics", "grocery", "electronics", "unknown")
 33 ##        @status = ("true", "true", "false", "true", "true")
 34 ## Output: (true, true, false, true, false)
 35 #
 36 #
 37 ## Example 3
 38 ##
 39 ## Input: @codes  = ("_123", "123", "", "Coupon_A", "Alpha")
 40 ##        @names  = ("restaurant", "electronics", "electronics", "pharmacy", "grocery")
 41 ##        @status = ("true", "true", "false", "true", "true")
 42 ## Output: (true, true, false, true, true)
 43 #
 44 #
 45 ## Example 4
 46 ##
 47 ## Input: @codes  = ("ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4")
 48 ##        @names  = ("electronics", "electronics", "grocery", "grocery")
 49 ##        @status = ("true", "true", "true", "true")
 50 ## Output: (true, true, true, true)
 51 #
 52 #
 53 ## Example 5
 54 ##
 55 ## Input: @codes  = ("CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99")
 56 ##        @names  = ("restaurant", "electronics", "grocery", "pharmacy", "electronics")
 57 ##        @status = ("true", "true", "true", "true", "false")
 58 ## Output: (true, true, true, true, false)
 59 #
 60 ############################################################
 61 ##
 62 ## discussion
 63 ##
 64 ############################################################
 65 #
 66 # For each index, we check all necessary elements for validity and record
 67 # "false" if one of them isn't fulfilled. In the end, add "true" if we didn't
 68 # add "false" earlier for this index.
 69 #
 70 use v5.36;
 71 
 72 validate_coupon(["A123", "B_456", "C789", "D\@1", "E123"],
 73                 ["electronics", "restaurant", "electronics", "pharmacy", "grocery"],
 74                 ["true", "false", "true", "true", "true"]);
 75 validate_coupon(["Z_9", "AB_12", "G01", "X99", "test"],
 76                 ["pharmacy", "electronics", "grocery", "electronics", "unknown"],
 77                 ["true", "true", "false", "true", "true"]);
 78 validate_coupon(["_123", "123", "", "Coupon_A", "Alpha"],
 79                 ["restaurant", "electronics", "electronics", "pharmacy", "grocery"],
 80                 ["true", "true", "false", "true", "true"]);
 81 validate_coupon(["ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4"],
 82                 ["electronics", "electronics", "grocery", "grocery"],
 83                 ["true", "true", "true", "true"]);
 84 validate_coupon(["CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99"],
 85                 ["restaurant", "electronics", "grocery", "pharmacy", "electronics"],
 86                 ["true", "true", "true", "true", "false"]);
 87 
 88 sub validate_coupon($codes, $names, $status) {
 89     say "Input: \@codes = (\"" . join("\", \"", @{$codes}) . "\"),";
 90     say "       \@names = (\"" . join("\", \"", @{$names}) . "\"),";
 91     say "       \@status = (\"" . join("\", \"", @{$status}) . "\")";
 92     my $max = scalar(@{$codes}) - 1;
 93     my @output = ();
 94     foreach my $i (0..$max) {
 95         if(length($codes->[$i]) == 0) {
 96             push @output, "false";
 97             next;
 98         }
 99         if($codes->[$i] =~ m/[^a-zA-Z0-9_]/) {
100             push @output, "false";
101             next;
102         }
103         if($names->[$i] ne "electronics" and $names->[$i] ne "grocery" and
104            $names->[$i] ne "pharmacy" and $names->[$i] ne "restaurant") {
105            push @output, "false";
106            next;
107         }
108         if($status->[$i] ne "true") {
109             push @output, "false";
110             next;
111         }
112         push @output, "true";
113     }
114     say "Output: (\"" . join("\", \"", @output) . "\")";
115 }