diff options
| author | Mark Anderson <mark@frontrangerunner.com> | 2020-03-21 00:35:52 -0600 |
|---|---|---|
| committer | Mark Anderson <mark@frontrangerunner.com> | 2020-03-21 00:35:52 -0600 |
| commit | aceb36086f8952fb3990757ee59456abd9c80e95 (patch) | |
| tree | 0623bb0bcde9d55290d51f18aefce51dbb33f149 | |
| parent | cea0632e71210f22caf22a2f99107e993ae77fd3 (diff) | |
| download | perlweeklychallenge-club-aceb36086f8952fb3990757ee59456abd9c80e95.tar.gz perlweeklychallenge-club-aceb36086f8952fb3990757ee59456abd9c80e95.tar.bz2 perlweeklychallenge-club-aceb36086f8952fb3990757ee59456abd9c80e95.zip | |
Challenge 52 Solutions
| -rw-r--r-- | challenge-052/mark-anderson/raku/ch-1.p6 | 38 | ||||
| -rw-r--r-- | challenge-052/mark-anderson/raku/ch-2.p6 | 46 |
2 files changed, 63 insertions, 21 deletions
diff --git a/challenge-052/mark-anderson/raku/ch-1.p6 b/challenge-052/mark-anderson/raku/ch-1.p6 index 1ffb7ccd0e..846a6a6301 100644 --- a/challenge-052/mark-anderson/raku/ch-1.p6 +++ b/challenge-052/mark-anderson/raku/ch-1.p6 @@ -1,34 +1,20 @@ #!/usr/bin/env raku -# I learned about polymod from Kevin Colyer's ch-2.p6 solution last week. -# I like that method for splitting up the number into its digits. - -sub MAIN($arg1, $arg2 where $arg1 >= 100 < $arg2 <= 999) { - for ($arg1..$arg2) -> $num { - my @digits = (+$num).polymod(10,10); - if (([-] @digits[0,1]).abs == ([-] @digits[1,2]).abs == 1) { - say $num; - } - } -} - -# There is a breadth first search solution that I found at +# A breadth first search solution at # https://www.geeksforgeeks.org/stepping-numbers/ -# I translated the C++ code into raku below. This is an -# alternate solution to my usual brute force approach above. - -#`[ -my @results; +# The C++ code translated to Raku. sub MAIN($arg1, $arg2 where $arg1 >= 100 < $arg2 <= 999) { + my @results; + for (0 .. 9) -> $num { - bfs($arg1, $arg2, $num); + bfs($arg1, $arg2, $num, @results); } @results.sort.join("\n").say; } -sub bfs(Int $n, Int $m, Int $num) { +sub bfs(Int $n, Int $m, Int $num, @results) { my @nums; @nums.push($num); @@ -63,4 +49,14 @@ sub bfs(Int $n, Int $m, Int $num) { } } } -] + +# A bonus brute force solution + +#sub MAIN($arg1, $arg2 where $arg1 >= 100 < $arg2 <= 999) { +# for ($arg1..$arg2) -> $num { +# my @digits = (+$num).polymod(10,10); +# if (([-] @digits[0,1]).abs == ([-] @digits[1,2]).abs == 1) { +# say $num; +# } +# } +#} diff --git a/challenge-052/mark-anderson/raku/ch-2.p6 b/challenge-052/mark-anderson/raku/ch-2.p6 new file mode 100644 index 0000000000..8d43a14545 --- /dev/null +++ b/challenge-052/mark-anderson/raku/ch-2.p6 @@ -0,0 +1,46 @@ +#!/usr/bin/env raku + +my $person; +my $computer; + +my @coins = <1 2 5 10 20 50 100 200>; + +@coins .= pick(8); + +my @players = 2.rand.Int ?? <person computer> !! <computer person>; + +say @players[0].tc, " goes first"; + +while @coins { + say @coins; + + if @players[@coins % 2] eq "person" { + if @coins == 1 { + $person += @coins.pop; + } + + else { + my $input = (prompt "Enter L or R ").uc; + + given $input { + when "R" { $person += @coins.pop } + when "L" { $person += @coins.shift } + } + } + } + + else { + my $index = @coins.antipairs.max.value; + + given $index { + when 0 { $computer += @coins.shift } + when @coins.end { $computer += @coins.pop } + when 1 { $computer += @coins.pop } + when @coins.end - 1 { $computer += @coins.shift } + default { $computer += @coins.pop } + } + } +} + +say "person: $person"; +say "computer: $computer"; |
