diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-01-20 17:51:43 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-20 17:51:43 +0000 |
| commit | 23ed6fd8bb1567958482dfa49d226585a070cb92 (patch) | |
| tree | 2d0529ec6b449f1574955c1502bcf4e35a7d6970 | |
| parent | 087975c964ff0d39eac847fd75d55ad27714ee6e (diff) | |
| parent | 13ec7fec2d9674a41bd17bbc597eb394d3b73c55 (diff) | |
| download | perlweeklychallenge-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.p6 | 59 | ||||
| -rw-r--r-- | challenge-044/simon-proctor/raku/ch-2.p6 | 18 |
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"; |
