aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Proctor <simon.proctor@zoopla.co.uk>2020-04-09 08:49:02 +0100
committerSimon Proctor <simon.proctor@zoopla.co.uk>2020-04-09 08:49:02 +0100
commit785933a044e5189adf705f021160a0dca3a5cf42 (patch)
treed7e69397922d987bcb1f29a0128f6a34b2572f96
parent6892c9a72b70d5ff780e68c06a9b27a590b680eb (diff)
downloadperlweeklychallenge-club-785933a044e5189adf705f021160a0dca3a5cf42.tar.gz
perlweeklychallenge-club-785933a044e5189adf705f021160a0dca3a5cf42.tar.bz2
perlweeklychallenge-club-785933a044e5189adf705f021160a0dca3a5cf42.zip
Refinements of challenge 2 attempt 2 and 3
-rw-r--r--challenge-055/simon-proctor/raku/ch-2-2.p635
-rw-r--r--challenge-055/simon-proctor/raku/ch-2-3.p614
2 files changed, 22 insertions, 27 deletions
diff --git a/challenge-055/simon-proctor/raku/ch-2-2.p6 b/challenge-055/simon-proctor/raku/ch-2-2.p6
index 327202b184..720ae11409 100644
--- a/challenge-055/simon-proctor/raku/ch-2-2.p6
+++ b/challenge-055/simon-proctor/raku/ch-2-2.p6
@@ -5,19 +5,19 @@ use v6.d;
# Second attempt at this using a different plan
#| Given a list of integers return all the wave sorted lists
multi sub MAIN( *@input where { $_.elems >= 2 && $_.all ~~ Int } ) {
- .join(",").say for find-waves( [], @input );
+ .say for find-waves( [], @input ).race.map( { $_.join(",") } );
}
# Start state
multi sub find-waves( [], @input is copy ) {
- my @res;
- for @input.kv -> $i, $val {
- my @poss = @input[0..^$i,$i^..*-1].flat;
- for find-waves( [$val], @poss, 'gte' ).grep( { defined $_ } ) -> @r {
- @res.push( @r );
+ gather {
+ for @input.kv -> $i, $val {
+ my @poss = @input[0..^$i,$i^..*-1].flat;
+ for find-waves( [$val], @poss, 'gte' ).grep( { defined $_ } ) -> @r {
+ take @r;
+ }
}
}
- return @res;
}
# End state
@@ -30,17 +30,16 @@ multi sub find-waves( @i, @p where { @i[*-1] > all(@p) }, 'lte' ) {}
# Possible State
multi sub find-waves( @output is copy, @input is copy, $test ) {
- my @out;
-
- my &test = $test ~~ 'gte' ?? &infix:«>=» !! &infix:«<=»;
-
- for @input.kv -> $i, $val {
- next unless &test( @output[*-1], $val );
- my @poss = @input[0..^$i,$i^..*-1].flat;
-
- for find-waves( [|@output, $val], @poss, $test ~~ 'gte' ?? 'lte' !! 'gte' ).grep( { defined $_ } ) -> @r {
- @out.push( @r );
+ gather {
+ my &test = $test ~~ 'gte' ?? &infix:«>=» !! &infix:«<=»;
+
+ for @input.kv -> $i, $val {
+ next unless &test( @output[*-1], $val );
+ my @poss = @input[0..^$i,$i^..*-1].flat;
+
+ for find-waves( [|@output, $val], @poss, $test ~~ 'gte' ?? 'lte' !! 'gte' ).grep( { defined $_ } ) -> @r {
+ take @r;
+ }
}
}
- return @out;
}
diff --git a/challenge-055/simon-proctor/raku/ch-2-3.p6 b/challenge-055/simon-proctor/raku/ch-2-3.p6
index f8fe36709b..36344999c5 100644
--- a/challenge-055/simon-proctor/raku/ch-2-3.p6
+++ b/challenge-055/simon-proctor/raku/ch-2-3.p6
@@ -26,16 +26,12 @@ multi sub MAIN( *@input where { $_.elems >= 2 && $_.all ~~ Int } ) {
$messages.done;
}
}
- start react {
- whenever $output-channel -> @out {
- @out.join(",").say;
- }
+ whenever $output-channel -> @out {
+ @out.join(",").say;
+ }
+ whenever $input-channel -> ( @i, @p, $t ) {
+ find-waves( @i, @p, $t, $input-channel, $output-channel, $messages );
}
- start react {
- whenever $input-channel -> ( @i, @p, $t ) {
- find-waves( @i, @p, $t, $input-channel, $output-channel, $messages );
- }
- }
}
}