aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Anderson <mark@frontrangerunner.com>2020-03-21 00:35:52 -0600
committerMark Anderson <mark@frontrangerunner.com>2020-03-21 00:35:52 -0600
commitaceb36086f8952fb3990757ee59456abd9c80e95 (patch)
tree0623bb0bcde9d55290d51f18aefce51dbb33f149
parentcea0632e71210f22caf22a2f99107e993ae77fd3 (diff)
downloadperlweeklychallenge-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.p638
-rw-r--r--challenge-052/mark-anderson/raku/ch-2.p646
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";