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 }