aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-01-20 17:51:43 +0000
committerGitHub <noreply@github.com>2020-01-20 17:51:43 +0000
commit23ed6fd8bb1567958482dfa49d226585a070cb92 (patch)
tree2d0529ec6b449f1574955c1502bcf4e35a7d6970
parent087975c964ff0d39eac847fd75d55ad27714ee6e (diff)
parent13ec7fec2d9674a41bd17bbc597eb394d3b73c55 (diff)
downloadperlweeklychallenge-club-23ed6fd8bb1567958482dfa49d226585a070cb92.tar.gz
perlweeklychallenge-club-23ed6fd8bb1567958482dfa49d226585a070cb92.tar.bz2
perlweeklychallenge-club-23ed6fd8bb1567958482dfa49d226585a070cb92.zip
Merge pull request #1151 from Scimon/master
Challenge number 1. Functional Raku for the win
-rw-r--r--challenge-044/simon-proctor/raku/ch-1.p659
-rw-r--r--challenge-044/simon-proctor/raku/ch-2.p618
2 files changed, 77 insertions, 0 deletions
diff --git a/challenge-044/simon-proctor/raku/ch-1.p6 b/challenge-044/simon-proctor/raku/ch-1.p6
new file mode 100644
index 0000000000..d99c7836bd
--- /dev/null
+++ b/challenge-044/simon-proctor/raku/ch-1.p6
@@ -0,0 +1,59 @@
+#!/usr/bin/env perl6
+
+use v6.d;
+
+multi sub concat( \a, \b ) { a ~ b }
+multi sub concat( @a, \b ) { ( @a[0..*-2], @a[*-1] ~ b ) }
+
+my %ops-map = (
+ '+' => &infix:<+>,
+ '-' => &infix:<->,
+ ',' => &infix:<,>,
+ '~' => &concat,
+);
+
+multi sub selections(0, *@) is pure {
+ return [];
+}
+
+multi sub selections(1,*@ops) is pure {
+ return [ @ops.map( -> $v { [$v] } ) ];
+}
+
+multi sub selections(UInt \c, *@ops) is pure {
+ lazy gather {
+ my @recur = selections(c-1, @ops);
+ for selections(1, @ops) -> @prefix {
+ for @recur -> @list {
+ take [|@prefix, |@list];
+ }
+ }
+ }
+}
+
+multi sub apply-ops( @list where *.elems == 2, @ops ) {
+ return @ops[0]( @list[0], @list[1] );
+}
+
+multi sub apply-ops( @list, @ops ) {
+ return @ops[*-1](apply-ops( @list[0..*-2], @ops[0..*-2] ), @list[*-1] );
+}
+
+sub display( @nums, @ops ) {
+ my $result = @nums.map( -> $v { $v ~ (@ops ?? @ops.shift !! '') } ).join("");
+}
+
+my @list = "1".."9";
+
+my @inputs = selections(@list.elems-1, ',', '~').map( -> @sel { apply-ops( @list, @sel.map( { %ops-map{$_} } ) ).flat } );
+
+for @inputs -> @test {
+ for selections(@test.elems-1, '+', '-') -> @ops {
+ my $result = apply-ops( @test, @ops.map( { %ops-map{$_} } ) );
+ if ( $result ~~ 100 ) {
+ say "{display(@test,@ops)} = $result";
+ }
+ }
+}
+
+
diff --git a/challenge-044/simon-proctor/raku/ch-2.p6 b/challenge-044/simon-proctor/raku/ch-2.p6
new file mode 100644
index 0000000000..3d87ee3192
--- /dev/null
+++ b/challenge-044/simon-proctor/raku/ch-2.p6
@@ -0,0 +1,18 @@
+#!/usr/bin/env perl6
+
+use v6.d;
+
+multi recur(1) {
+ return "1";
+}
+
+multi recur( \v where * %% 2 ) {
+ return recur( v div 2 ), " * 2";
+}
+
+multi recur( \v ) {
+ return "((", recur( v - 1 ), ") + 1)";
+}
+
+
+say "{recur( 100 ).flat.join('')} == 100";