diff options
| author | Jan Krňávek <Jan.Krnavek@gmail.com> | 2021-03-20 18:22:20 +0100 |
|---|---|---|
| committer | Jan Krňávek <Jan.Krnavek@gmail.com> | 2021-03-20 18:22:20 +0100 |
| commit | ae0ea56b3c6560c288cbc8b852e97157462764d8 (patch) | |
| tree | b026387a9628316d5c2f222cf4ba1dec75e31759 /challenge-104 | |
| parent | 19750d81e7350048af6c55560ead52cad5e2eebc (diff) | |
| download | perlweeklychallenge-club-ae0ea56b3c6560c288cbc8b852e97157462764d8.tar.gz perlweeklychallenge-club-ae0ea56b3c6560c288cbc8b852e97157462764d8.tar.bz2 perlweeklychallenge-club-ae0ea56b3c6560c288cbc8b852e97157462764d8.zip | |
solutions week 104
Diffstat (limited to 'challenge-104')
| -rw-r--r-- | challenge-104/wambash/raku/ch-1.raku | 34 | ||||
| -rw-r--r-- | challenge-104/wambash/raku/ch-2.raku | 57 |
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; +} |
