diff options
87 files changed, 1317 insertions, 0 deletions
diff --git a/challenge-233/feng-chang/raku/ch-1.raku b/challenge-233/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..720a718cfb --- /dev/null +++ b/challenge-233/feng-chang/raku/ch-1.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@words); + +put @words.combinations(2).grep({ .[0].comb ≡ .[1].comb }).join("\n"); diff --git a/challenge-233/feng-chang/raku/ch-2.raku b/challenge-233/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..a82de442e2 --- /dev/null +++ b/challenge-233/feng-chang/raku/ch-2.raku @@ -0,0 +1,6 @@ +#!/bin/env raku + +unit sub MAIN(*@N); + +my %freq = @N.Bag; +put @N.sort({ %freq{$_}, -$_ }).join(','); diff --git a/challenge-233/feng-chang/raku/test.raku b/challenge-233/feng-chang/raku/test.raku new file mode 100755 index 0000000000..ef98a74848 --- /dev/null +++ b/challenge-233/feng-chang/raku/test.raku @@ -0,0 +1,31 @@ +#!/bin/env raku + +# The Weekly Challenge 233 +use Test; + +sub pwc-test(Str:D $script, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + is $p.out.slurp(:close).chomp, $expect, $assertion; +} + +# Task 1, Similar Words +pwc-test + './ch-1.raku', |<aba aabb abcd bac aabc>, + "aba aabb\nbac aabc", + 'Similar Words: ("aba", "aabb", "abcd", "bac", "aabc") => "aba aabb\nbac aabc"'; +pwc-test + './ch-1.raku', |<aabb ab ba>, + "aabb ab\naabb ba\nab ba", + 'Similar Words: ("aabb", "ab", "ba") => "aabb ab\naabb ba\nab ba"'; +pwc-test + './ch-1.raku', |<nba cba dba>, + "", + 'Similar Words: ("nba", "cba", "dba") => ""'; + +# Task 2, Frequency Sort + pwc-test './ch-2.raku', |<1 1 2 2 2 3>, '3,1,1,2,2,2', 'Frequency Sort: 1,1,2,2,2,3 => 3,1,1,2,2,2'; + pwc-test './ch-2.raku', |<2 3 1 3 2>, '1,3,3,2,2', 'Frequency Sort: 2,3,1,3,2 => 1,3,3,2,2'; + pwc-test './ch-2.raku', |<-- -1 1 -6 4 5 -6 1 4 1>, '5,-1,4,4,-6,-6,1,1,1', 'Frequency Sort: -1,1,-6,4,5,-6,1,4,1 => 5,-1,4,4,-6,-6,1,1,1'; + +done-testing; diff --git a/challenge-234/feng-chang/raku/ch-1.raku b/challenge-234/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..5163d74a08 --- /dev/null +++ b/challenge-234/feng-chang/raku/ch-1.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@words); + +put ([(&)] @words.map({ .comb.Bag })).map({ .key xx .value }); diff --git a/challenge-234/feng-chang/raku/ch-2.raku b/challenge-234/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..c4c96ca5d6 --- /dev/null +++ b/challenge-234/feng-chang/raku/ch-2.raku @@ -0,0 +1,6 @@ +#!/bin/env raku + +unit sub MAIN(*@ints); + +@ints = +«@ints; +put +@ints.combinations(3).grep({ .all == .one }); diff --git a/challenge-234/feng-chang/raku/test.raku b/challenge-234/feng-chang/raku/test.raku new file mode 100755 index 0000000000..858a89c782 --- /dev/null +++ b/challenge-234/feng-chang/raku/test.raku @@ -0,0 +1,35 @@ +#!/bin/env raku + +# The Weekly Challenge 234 +use Test; + +sub pwc-test(Str:D $script, Bool :$deeply? = False, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + if $deeply { + is-deeply $p.out.slurp(:close).chomp.words.Bag, $expect, $assertion; + } else { + is $p.out.slurp(:close).chomp, $expect, $assertion; + } +} + +# Task 1, Common Characters +pwc-test :deeply, + './ch-1.raku', |<java javascript julia>, + 'j a'.words.Bag, + 'Common Characters: ("java", "javascript", "julia") => "j a"'; +pwc-test :deeply, + './ch-1.raku', |<bella label roller>, + 'e l l'.words.Bag, + 'Common Characters: ("bella", "label", "roller") => "e l l"'; +pwc-test :deeply, + './ch-1.raku', |<cool lock cook>, + 'c o'.words.Bag, + 'Common Characters: ("cool", "lock", "cook") => "c o"'; + +# Task 2, Unequal Triplets + pwc-test './ch-2.raku', |<4 4 2 4 3>, 3, 'Unequal Triplets: 4, 4, 2, 4, 3 => 3'; + pwc-test './ch-2.raku', |<1 1 1 1 1>, 0, 'Unequal Triplets: 1, 1, 1, 1, 1 => 0'; + pwc-test './ch-2.raku', |<4 7 1 10 7 4 1 1>, 28, 'Unequal Triplets: 4, 7, 1, 10, 7, 4, 1, 1 => 28'; + +done-testing; diff --git a/challenge-235/feng-chang/raku/ch-1.raku b/challenge-235/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..744159fa8b --- /dev/null +++ b/challenge-235/feng-chang/raku/ch-1.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@ints); + +put so (^@ints).grep({ [<] @ints[(^@ints).grep(*!=$_)] }); diff --git a/challenge-235/feng-chang/raku/ch-2.raku b/challenge-235/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..462cf0a2b1 --- /dev/null +++ b/challenge-235/feng-chang/raku/ch-2.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@ints); + +put @ints.map({ $_ || 0 xx 2 }).flat[^@ints]; diff --git a/challenge-235/feng-chang/raku/test.raku b/challenge-235/feng-chang/raku/test.raku new file mode 100755 index 0000000000..31899f731f --- /dev/null +++ b/challenge-235/feng-chang/raku/test.raku @@ -0,0 +1,26 @@ +#!/bin/env raku + +# The Weekly Challenge 235 +use Test; + +sub pwc-test(Str:D $script, Bool :$deeply? = False, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + if $deeply { + is-deeply $p.out.slurp(:close).chomp.words.Bag, $expect, $assertion; + } else { + is $p.out.slurp(:close).chomp, $expect, $assertion; + } +} + +# Task 1, Remove One +pwc-test './ch-1.raku', |<0 2 9 4 6>, 'True', 'Remove One: (0, 2, 9, 4, 6) => True'; +pwc-test './ch-1.raku', |<5 1 3 2>, 'False', 'Remove One: (5, 1, 3, 2) => False'; +pwc-test './ch-1.raku', |<2 2 3>, 'True', 'Remove One: (2, 2, 3) => True'; + +# Task 2, Duplicate Zeros +pwc-test './ch-2.raku', |<1 0 2 3 0 4 5 0>, '1 0 0 2 3 0 0 4', 'Duplicate Zeros: (1, 0, 2, 3, 0, 4, 5, 0) => (1, 0, 0, 2, 3, 0, 0, 4)'; +pwc-test './ch-2.raku', |<1 2 3>, '1 2 3', 'Duplicate Zeros: (1, 2, 3) => (1, 2, 3)'; +pwc-test './ch-2.raku', |<0 3 0 4 5>, '0 0 3 0 0', 'Duplicate Zeros: (0, 3, 0, 4, 5) => (0, 0, 3, 0, 0)'; + +done-testing; diff --git a/challenge-236/feng-chang/raku/ch-1.raku b/challenge-236/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..f48584cdf1 --- /dev/null +++ b/challenge-236/feng-chang/raku/ch-1.raku @@ -0,0 +1,22 @@ +#!/bin/env raku + +unit sub MAIN(*@bills); + +my method can-pay(UInt:D $bill : %change --> Bool:D) { + my $remain = $bill - 5; + return False if $remain < 0; + + while $remain > 0 { + my $bill_ = %change.keys.sort(-*).first(* ≤ $remain); + return False without $bill_; + + --%change{$bill_}; + $remain -= $bill_; + } + + ++%change{$bill}; + True +} + +my %change is BagHash; +put so @bills».&can-pay(%change).all; diff --git a/challenge-236/feng-chang/raku/ch-2.raku b/challenge-236/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..c2ede0b78b --- /dev/null +++ b/challenge-236/feng-chang/raku/ch-2.raku @@ -0,0 +1,21 @@ +#!/bin/env raku + +unit sub MAIN(*@ints); + +my %remain is SetHash = |@ints; +my @loops; + +while %remain { + my @cache; + my $i = %remain.keys.min; + + repeat { + $i = @ints[$i]; + @cache.grep($i) ?? last() !! @cache.push($i); + } while True; + + @loops.push(@cache); + %remain.unset($_) for @cache; +} + +put +@loops; diff --git a/challenge-236/feng-chang/raku/test.raku b/challenge-236/feng-chang/raku/test.raku new file mode 100755 index 0000000000..719578eb67 --- /dev/null +++ b/challenge-236/feng-chang/raku/test.raku @@ -0,0 +1,35 @@ +#!/bin/env raku + +# The Weekly Challenge 236 +use Test; + +sub pwc-test(Str:D $script, Bool :$deeply? = False, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + if $deeply { + is-deeply $p.out.slurp(:close).chomp.words.Bag, $expect, $assertion; + } else { + is $p.out.slurp(:close).chomp, $expect, $assertion; + } +} + +# Task 1, Exact Change +pwc-test './ch-1.raku', |<5 5 5 10 20>, 'True', 'Exact Change: (5, 5, 5, 10, 20) => True'; +pwc-test './ch-1.raku', |<5 5 10 10 20>, 'False', 'Exact Change: (5, 5, 10, 10, 20) => False'; +pwc-test './ch-1.raku', |<5 5 5 20>, 'True', 'Exact Change: (5, 5, 5, 20) => True'; + +# Task 2, Array Loops +pwc-test './ch-2.raku', + |<4 6 3 8 15 0 13 18 7 16 14 19 17 5 11 1 12 2 9 10>, + 3, + 'Array Loops: (4,6,3,8,15,0,13,18,7,16,14,19,17,5,11,1,12,2,9,10) => 3'; +pwc-test './ch-2.raku', + |<0 1 13 7 6 8 10 11 2 14 16 4 12 9 17 5 3 18 15 19>, + 6, + 'Array Loops: (0,1,13,7,6,8,10,11,2,14,16,4,12,9,17,5,3,18,15,19) => 6'; +pwc-test './ch-2.raku', + |<9 8 3 11 5 7 13 19 12 4 14 10 18 2 16 1 0 15 6 17>, + 1, + 'Array Loops: (9,8,3,11,5,7,13,19,12,4,14,10,18,2,16,1,0,15,6,17) => 1'; + +done-testing; diff --git a/challenge-237/feng-chang/raku/ch-1.raku b/challenge-237/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..3e4b04e828 --- /dev/null +++ b/challenge-237/feng-chang/raku/ch-1.raku @@ -0,0 +1,10 @@ +#!/bin/env raku + +unit sub MAIN(UInt:D $year, UInt:D $month, UInt:D $week-of-month, UInt:D $day-of-week); + +my $month_ = $month.fmt('%02d'); +my $dow01 = Date.new("{$year}-{$month_}-01").day-of-week; +my $target = 1 + ($day-of-week - $dow01 + 7) % 7 + 7 * ($week-of-month - 1); +put try { + Date.new("{$year}-{$month_}-{$target.fmt('%02d')}"); +} ?? $target !! 0; diff --git a/challenge-237/feng-chang/raku/ch-1a.raku b/challenge-237/feng-chang/raku/ch-1a.raku new file mode 100755 index 0000000000..018d31ccb4 --- /dev/null +++ b/challenge-237/feng-chang/raku/ch-1a.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(UInt:D $year, UInt:D $month, UInt:D $week-of-month, UInt:D $day-of-week); + +put (1..31).grep({ Date.new("{$year}-{$month.fmt('%02d')}-{.fmt('%02d')}").day-of-week == $day-of-week })[$week-of-month - 1] // 0; diff --git a/challenge-237/feng-chang/raku/ch-2.raku b/challenge-237/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..8279088ca3 --- /dev/null +++ b/challenge-237/feng-chang/raku/ch-2.raku @@ -0,0 +1,5 @@ +#!/bin/env raku + +unit sub MAIN(*@nums); + +put @nums.permutations.map((@nums Z< *).sum).max; diff --git a/challenge-237/feng-chang/raku/test.raku b/challenge-237/feng-chang/raku/test.raku new file mode 100755 index 0000000000..dfa76c8be9 --- /dev/null +++ b/challenge-237/feng-chang/raku/test.raku @@ -0,0 +1,29 @@ +#!/bin/env raku + +# The Weekly Challenge 236 +use Test; + +sub pwc-test(Str:D $script, Bool :$deeply? = False, *@input) { + my ($expect, $assertion) = @input.splice(*-2, 2); + my $p = run $script, |@input, :out; + if $deeply { + is-deeply $p.out.slurp(:close).chomp.words.Bag, $expect, $assertion; + } else { + is $p.out.slurp(:close).chomp, $expect, $assertion; + } +} + +# Task 1, Seize The Day +pwc-test './ch-1.raku', |<2024 4 3 2>, 16, 'Seize The Day: (2024, 4, 3, 2) => 16'; +pwc-test './ch-1.raku', |<2025 10 2 4>, 9, 'Seize The Day: (2025, 10, 2, 4) => 9'; +pwc-test './ch-1.raku', |<2026 8 5 3>, 0, 'Seize The Day: (2026, 8, 5, 3) => 0'; + +pwc-test './ch-1a.raku', |<2024 4 3 2>, 16, 'Seize The Day: (2024, 4, 3, 2) => 16'; +pwc-test './ch-1a.raku', |<2025 10 2 4>, 9, 'Seize The Day: (2025, 10, 2, 4) => 9'; +pwc-test './ch-1a.raku', |<2026 8 5 3>, 0, 'Seize The Day: (2026, 8, 5, 3) => 0'; + +# Task 2, Maximise Greatness +pwc-test './ch-2.raku', |<1 3 5 2 1 3 1>, 4, 'Maximise Greatness: (1, 3, 5, 2, 1, 3, 1) => 4'; +pwc-test '. |
