diff --git a/challenge-353/packy-anderson/README.md b/challenge-353/packy-anderson/README.md index ced1bf82ef..0a04c535c0 100644 --- a/challenge-353/packy-anderson/README.md +++ b/challenge-353/packy-anderson/README.md @@ -22,4 +22,4 @@ ## Blog Post -[Perl Weekly Challenge: Doodling with matches and prefixes](https://packy.dardan.com/b/fi) +[Perl Weekly Challenge: Ok, swing code... SWING!](https://packy.dardan.com/b/g4) diff --git a/challenge-353/packy-anderson/blog.txt b/challenge-353/packy-anderson/blog.txt new file mode 100644 index 0000000000..fe9019652b --- /dev/null +++ b/challenge-353/packy-anderson/blog.txt @@ -0,0 +1 @@ +https://packy.dardan.com/b/g4 \ No newline at end of file diff --git a/challenge-353/packy-anderson/elixir/ch-1.exs b/challenge-353/packy-anderson/elixir/ch-1.exs new file mode 100755 index 0000000000..5c516f1731 --- /dev/null +++ b/challenge-353/packy-anderson/elixir/ch-1.exs @@ -0,0 +1,37 @@ +#!/usr/bin/env elixir + +defmodule PWC do + def word_count(sentence) do + sentence |> String.split |> length + end + + def max_words(sentences) do + sentences |> Enum.map(&word_count/1) |> Enum.max + end + + def solution(sentences) do + joined = sentences + |> Enum.map(fn s -> "\"#{s}\"" end) + |> Enum.join(", ") + IO.puts("Input: @sentences = (#{joined})") + IO.puts("Output: #{max_words(sentences)}") + end +end + +IO.puts("Example 1:") +PWC.solution(["Hello world", "This is a test", "Perl is great"]) + +IO.puts("\nExample 2:") +PWC.solution(["Single"]) + +IO.puts("\nExample 3:") +PWC.solution(["Short", "This song's just six words long", + "A B C", "Just four words here"]) + +IO.puts("\nExample 4:") +PWC.solution(["One", "Two parts", "Three part phrase", ""]) + +IO.puts("\nExample 5:") +PWC.solution(["The quick brown fox jumps over the lazy dog", "A", + "She sells seashells by the seashore", + "To be or not to be that is the question"]) diff --git a/challenge-353/packy-anderson/elixir/ch-2.exs b/challenge-353/packy-anderson/elixir/ch-2.exs new file mode 100755 index 0000000000..6741c60680 --- /dev/null +++ b/challenge-353/packy-anderson/elixir/ch-2.exs @@ -0,0 +1,71 @@ +#!/usr/bin/env elixir + +defmodule PWC do + @good_names ["electronics", "grocery", "pharmacy", "restaurant"] + + def check_coupon([code, name, status]) do + cond do + status == "true" and + Enum.any?(@good_names, fn n -> n == name end) and + Regex.match?(~r/^[a-zA-Z0-9_]+$/, code) -> "true" + true -> "false" + end + end + + def validate_coupon(%{codes: codes, names: names, + status: status}) do + Enum.zip_with([codes, names, status], &check_coupon/1) + end + + def quoted_list(items) do + items |> Enum.map(fn s -> "\"#{s}\"" end) |> Enum.join(", ") + end + + def solution(%{codes: codes, names: names, status: status}) do + IO.puts("Input: @codes = (#{quoted_list(codes)})") + IO.puts(" @names = (#{quoted_list(names)})") + IO.puts(" @status = (#{quoted_list(status)})") + output = validate_coupon(%{codes: codes, names: names, status: status}) + |> Enum.join(", ") + IO.puts("Output: (#{output})") + end +end + +IO.puts("Example 1:") +PWC.solution(%{ + codes: ["A123", "B_456", "C789", "D@1", "E123"], + names: ["electronics", "restaurant", "electronics", + "pharmacy", "grocery"], + status: ["true", "false", "true", "true", "true"] +}) + +IO.puts("\nExample 2:") +PWC.solution(%{ + codes: ["Z_9", "AB_12", "G01", "X99", "test"], + names: ["pharmacy", "electronics", "grocery", + "electronics", "unknown"], + status: ["true", "true", "false", "true", "true"] +}) + +IO.puts("\nExample 3:") +PWC.solution(%{ + codes: ["_123", "123", "", "Coupon_A", "Alpha"], + names: ["restaurant", "electronics", "electronics", + "pharmacy", "grocery"], + status: ["true", "true", "false", "true", "true"] +}) + +IO.puts("\nExample 4:") +PWC.solution(%{ + codes: ["ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4"], + names: ["electronics", "electronics", "grocery", "grocery"], + status: ["true", "true", "true", "true"] +}) + +IO.puts("\nExample 5:") +PWC.solution(%{ + codes: ["CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99"], + names: ["restaurant", "electronics", "grocery", "pharmacy", + "electronics"], + status: ["true", "true", "true", "true", "false"] +}) diff --git a/challenge-353/packy-anderson/perl/ch-1.pl b/challenge-353/packy-anderson/perl/ch-1.pl new file mode 100755 index 0000000000..90b47bbe95 --- /dev/null +++ b/challenge-353/packy-anderson/perl/ch-1.pl @@ -0,0 +1,37 @@ +#!/usr/bin/env perl +use v5.40; + +use List::AllUtils qw( max ); + +sub wordCount($sentence) { + scalar(split(/\s+/, $sentence)); +} + +sub maxWords(@sentences) { + max map { wordCount($_) } @sentences; +} + +sub solution($sentences) { + my $joined = join(', ', map { qq{"$_"} } @$sentences); + say 'Input: @sentences = (' . $joined . ')'; + say 'Output: ' . maxWords(@$sentences); +} + +say "Example 1:"; +solution(["Hello world", "This is a test", "Perl is great"]); + +say "\nExample 2:"; +solution(["Single"]); + +say "\nExample 3:"; +solution(["Short", "This song's just six words long", + "A B C", "Just four words here"]); + +say "\nExample 4:"; +solution(["One", "Two parts", "Three part phrase", ""]); + +say "\nExample 5:"; +solution(["The quick brown fox jumps over the lazy dog", "A", + "She sells seashells by the seashore", + "To be or not to be that is the question"]); + diff --git a/challenge-353/packy-anderson/perl/ch-2.pl b/challenge-353/packy-anderson/perl/ch-2.pl new file mode 100755 index 0000000000..1c8b490eb4 --- /dev/null +++ b/challenge-353/packy-anderson/perl/ch-2.pl @@ -0,0 +1,71 @@ +#!/usr/bin/env perl +use v5.40; + +use List::AllUtils qw( any zip_by ); + +my @good_names = + ("electronics", "grocery", "pharmacy", "restaurant"); + +sub checkCoupon($code, $name, $status) { + return 'true' if $status eq 'true' + && (any { $name eq $_ } @good_names) + && $code =~ /^[a-zA-Z0-9_]+$/; + return 'false'; +} + +sub validateCoupon($params) { + zip_by { + checkCoupon(@_) + } $params->{codes}, $params->{names}, $params->{status}; +} + +sub quotedList($list) { + join(", ", map { qq{"$_"} } @$list); +} + +sub solution($params) { + say "Input: \@codes = (@{[quotedList($params->{codes})]})"; + say " \@names = (@{[quotedList($params->{names})]})"; + say " \@status = (@{[quotedList($params->{status})]})"; + my $output = join ", ", validateCoupon($params); + say "Output: ($output)"; +} + +say "Example 1:"; +solution({ + codes => ["A123", "B_456", "C789", 'D@1', "E123"], + names => ["electronics", "restaurant", "electronics", + "pharmacy", "grocery"], + status => ["true", "false", "true", "true", "true"] +}); + +say "\nExample 2:"; +solution({ + codes => ["Z_9", "AB_12", "G01", "X99", "test"], + names => ["pharmacy", "electronics", "grocery", + "electronics", "unknown"], + status => ["true", "true", "false", "true", "true"] +}); + +say "\nExample 3:"; +solution({ + codes => ["_123", "123", "", "Coupon_A", "Alpha"], + names => ["restaurant", "electronics", "electronics", + "pharmacy", "grocery"], + status => ["true", "true", "false", "true", "true"] +}); + +say "\nExample 4:"; +solution({ + codes => ["ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4"], + names => ["electronics", "electronics", "grocery", "grocery"], + status => ["true", "true", "true", "true"] +}); + +say "\nExample 5:"; +solution({ + codes => ["CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99"], + names => ["restaurant", "electronics", "grocery", "pharmacy", + "electronics"], + status => ["true", "true", "true", "true", "false"] +}); diff --git a/challenge-353/packy-anderson/python/ch-1.py b/challenge-353/packy-anderson/python/ch-1.py new file mode 100755 index 0000000000..14571beb54 --- /dev/null +++ b/challenge-353/packy-anderson/python/ch-1.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +def word_count(sentences): + return len(sentences.split()) + +def max_words(sentences): + return max([word_count(s) for s in sentences]) + +def solution(sentences): + joined = ", ".join([f'"{s}"' for s in sentences]) + print(f'Input: @sentences = ({joined})') + print(f'Output: {max_words(sentences)}') + +print('Example 1:') +solution(["Hello world", "This is a test", "Perl is great"]) + +print('\nExample 2:') +solution(["Single"]) + +print('\nExample 3:') +solution(["Short", "This song's just six words long", + "A B C", "Just four words here"]) + +print('\nExample 4:') +solution(["One", "Two parts", "Three part phrase", ""]) + +print('\nExample 5:') +solution(["The quick brown fox jumps over the lazy dog", "A", + "She sells seashells by the seashore", + "To be or not to be that is the question"]) diff --git a/challenge-353/packy-anderson/python/ch-2.py b/challenge-353/packy-anderson/python/ch-2.py new file mode 100755 index 0000000000..38124b57fe --- /dev/null +++ b/challenge-353/packy-anderson/python/ch-2.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +import re + +good_names = [ + "electronics", "grocery", "pharmacy", "restaurant" +] + +def check_coupon(code, name, status): + if ( + status == 'true' and + name in good_names and + re.fullmatch(r'^[a-zA-Z0-9_]+$', code) + ): + return 'true' + else: + return 'false' + +def validate_coupon(params): + coupons = [] + for t in zip(params["codes"], + params["names"], + params["status"]): + coupons.append(check_coupon(*t)) + return coupons + +def quoted_list(arr): + return ", ".join([f'"{s}"' for s in arr]) + +def solution(params): + print(f'Input: @codes = ({quoted_list(params["codes"])})') + print(f' @names = ({quoted_list(params["names"])})') + print(f' @status = ({quoted_list(params["status"])})') + output = ", ".join(validate_coupon(params)) + print(f'Output: {output}') + +print('Example 1:') +solution({ + 'codes': ["A123", "B_456", "C789", 'D@1', "E123"], + 'names': ["electronics", "restaurant", "electronics", + "pharmacy", "grocery"], + 'status': ["true", "false", "true", "true", "true"] +}) + +print('\nExample 2:') +solution({ + 'codes': ["Z_9", "AB_12", "G01", "X99", "test"], + 'names': ["pharmacy", "electronics", "grocery", + "electronics", "unknown"], + 'status': ["true", "true", "false", "true", "true"] +}) + +print('\nExample 3:') +solution({ + 'codes': ["_123", "123", "", "Coupon_A", "Alpha"], + 'names': ["restaurant", "electronics", "electronics", + "pharmacy", "grocery"], + 'status': ["true", "true", "false", "true", "true"] +}) + +print('\nExample 4:') +solution({ + 'codes': ["ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4"], + 'names': ["electronics", "electronics", "grocery", "grocery"], + 'status': ["true", "true", "true", "true"] +}) + +print('\nExample 5:') +solution({ + 'codes': ["CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99"], + 'names': ["restaurant", "electronics", "grocery", "pharmacy", + "electronics"], + 'status': ["true", "true", "true", "true", "false"] +}) diff --git a/challenge-353/packy-anderson/raku/ch-1.raku b/challenge-353/packy-anderson/raku/ch-1.raku new file mode 100755 index 0000000000..4c93623f17 --- /dev/null +++ b/challenge-353/packy-anderson/raku/ch-1.raku @@ -0,0 +1,34 @@ +#!/usr/bin/env raku +use v6; + +sub wordCount($sentence) { + $sentence.split(/\s+/).elems; +} + +sub maxWords(@sentences) { + @sentences.map({ wordCount($_) }).max; +} + +sub solution(@sentences) { + my $joined = @sentences.map({ qq{"$_"}}).join(', '); + say 'Input: @sentences = (' ~ $joined ~ ')'; + say 'Output: ' ~ maxWords(@sentences); +} + +say "Example 1:"; +solution(["Hello world", "This is a test", "Perl is great"]); + +say "\nExample 2:"; +solution(["Single"]); + +say "\nExample 3:"; +solution(["Short", "This song's just six words long", + "A B C", "Just four words here"]); + +say "\nExample 4:"; +solution(["One", "Two parts", "Three part phrase", ""]); + +say "\nExample 5:"; +solution(["The quick brown fox jumps over the lazy dog", "A", + "She sells seashells by the seashore", + "To be or not to be that is the question"]); diff --git a/challenge-353/packy-anderson/raku/ch-2.raku b/challenge-353/packy-anderson/raku/ch-2.raku new file mode 100755 index 0000000000..3eef63d82a --- /dev/null +++ b/challenge-353/packy-anderson/raku/ch-2.raku @@ -0,0 +1,72 @@ +#!/usr/bin/env raku +use v6; + +my @good_names = + ["electronics", "grocery", "pharmacy", "restaurant"]; + +sub checkCoupon($code, $name, $status) { + return 'true' if $status eq 'true' + && $name eq @good_names.any + && $code ~~ /^[]+$/; + return 'false'; +} + +sub validateCoupon(:@codes, :@names, :@status) { + my @coupons; + for @codes Z @names Z @status -> ($c, $n, $s) { + @coupons.push(checkCoupon($c, $n, $s)); + } + return @coupons; +} + +sub quotedList(@list) { + @list.map({qq{"$_"}}).join(", "); +} + +sub solution(:@codes, :@names, :@status) { + say "Input: \@codes = ({quotedList(@codes)})"; + say " \@names = ({quotedList(@names)})"; + say " \@status = ({quotedList(@status)})"; + my $output = validateCoupon(:@codes, :@names, :@status) + .join(", "); + say "Output: ($output)"; +} + +say "Example 1:"; +solution( + codes => ["A123", "B_456", "C789", 'D@1', "E123"], + names => ["electronics", "restaurant", "electronics", + "pharmacy", "grocery"], + status => ["true", "false", "true", "true", "true"] +); + +say "\nExample 2:"; +solution( + codes => ["Z_9", "AB_12", "G01", "X99", "test"], + names => ["pharmacy", "electronics", "grocery", + "electronics", "unknown"], + status => ["true", "true", "false", "true", "true"] +); + +say "\nExample 3:"; +solution( + codes => ["_123", "123", "", "Coupon_A", "Alpha"], + names => ["restaurant", "electronics", "electronics", + "pharmacy", "grocery"], + status => ["true", "true", "false", "true", "true"] +); + +say "\nExample 4:"; +solution( + codes => ["ITEM_1", "ITEM_2", "ITEM_3", "ITEM_4"], + names => ["electronics", "electronics", "grocery", "grocery"], + status => ["true", "true", "true", "true"] +); + +say "\nExample 5:"; +solution( + codes => ["CAFE_X", "ELEC_100", "FOOD_1", "DRUG_A", "ELEC_99"], + names => ["restaurant", "electronics", "grocery", "pharmacy", + "electronics"], + status => ["true", "true", "true", "true", "false"] +);