aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-104/wambash/raku/ch-1.raku34
-rw-r--r--challenge-104/wambash/raku/ch-2.raku57
2 files changed, 91 insertions, 0 deletions
diff --git a/challenge-104/wambash/raku/ch-1.raku b/challenge-104/wambash/raku/ch-1.raku
new file mode 100644
index 0000000000..9f36ab68ad
--- /dev/null
+++ b/challenge-104/wambash/raku/ch-1.raku
@@ -0,0 +1,34 @@
+#!/usr/bin/env raku
+#!/usr/bin/env raku
+
+my @fusc = (^∞).map: *.&fusc ;
+multi fusc( 0 --> 0 ) {}
+multi fusc( 1 --> 1 ) {}
+multi fusc(Int $n where $n %% 2) { @fusc[$n/2] };
+multi fusc(Int $n) { @fusc[($n-1)/2] + @fusc[($n+1)/2] };
+
+multi MAIN ($n) {
+ say @fusc[$n]
+}
+
+multi MAIN (Bool :$test!) {
+ use Test;
+
+ my @fusc-test = (
+ 0, 1, 1, 2, 1, 3, 2, 3,
+ 1, 4, 3, 5, 2, 5, 3, 4,
+ 1, 5, 4, 7, 3, 8, 5, 7,
+ 2, 7, 5, 8, 3, 7, 4, 5,
+ 1, 6, 5, 9, 4, 11, 7, 10,
+ 3, 11, 8, 13, 5, 12, 7, 9,
+ 2, 9, 7, 12, 5, 13, 8, 11, 3,
+ 10, 7, 11, 4, 9, 5, 6, 1, 7, 6,
+ 11, 5, 14, 9, 13, 4, 15, 11, 18, 7,
+ 17, 10, 13, 3, 14, 11, 19, 8, 21,
+ 13, 18, 5, 17, 12, 19,
+ );
+
+ is @fusc.head(92), @fusc-test;
+
+ done-testing;
+}
diff --git a/challenge-104/wambash/raku/ch-2.raku b/challenge-104/wambash/raku/ch-2.raku
new file mode 100644
index 0000000000..c702f45c2f
--- /dev/null
+++ b/challenge-104/wambash/raku/ch-2.raku
@@ -0,0 +1,57 @@
+#!/usr/bin/env raku
+use v6;
+
+sub random ( $tokens ) {
+ (1..3).pick min $tokens
+}
+
+sub smart ( $tokens ) {
+ ($tokens % 4) max 1
+}
+
+sub semi-smart ( $tokens ) {
+ (&smart,&random).pick.($tokens)
+}
+
+sub human ( $tokens ) {
+ prompt('pick 1, 2 or 3: ')
+}
+
+my %players = :&human, :&smart, :&random, :&semi-smart;
+
+subset Pick of Int where * ∈ 1..3;
+sub play ($tokens, &rival) {
+ my Pick $pick = $tokens.&rival;
+ $tokens - $pick;
+}
+
+sub nim ( :&fp, :&sp, :$tokens = 12 ) {
+ $tokens, |(|(&fp, &sp) xx *)
+ andthen $_ Z=> .produce: &play
+ andthen .first: *.value ≤ 0
+ andthen .key.name;
+}
+
+
+multi MAIN (
+ $first-player = 'human', #= human. smart, semi-smart or random
+ $second-player = 'semi-smart', #= human. smart, semi-smart or random
+ Int :$tokens = 12,
+) {
+ &play.wrap: -> $tokens, &rival {
+ say "$tokens tokens {&rival.name} plays";
+ callsame;
+ }
+ say nim( fp => %players{$first-player}, sp => %players{$second-player}, :$tokens ), ' wins'
+}
+
+
+multi MAIN (Bool :$test! ) {
+ use Test;
+ is smart(4), 1;
+ is smart(17),1;
+ is play(12,&smart), 11;
+ is play(23,&smart), 20;
+ is nim(fp => &smart, sp => &random, tokens => 21), 'smart', 'smart wins with 21 tokens';
+ done-testing;
+}