aboutsummaryrefslogtreecommitdiff
path: root/challenge-191
diff options
context:
space:
mode:
authorScimon <simon.proctor@gmail.com>2022-11-17 09:24:28 +0000
committerScimon <simon.proctor@gmail.com>2022-11-17 09:24:28 +0000
commit86ff03fc4c991e427d7aba2aa3d1ec8abc9008fe (patch)
treef7729d29e8277dcda871d5368e09f10ed11c289c /challenge-191
parenta3a37f596f2e306493de2ecdf3d7311dfb53d93e (diff)
downloadperlweeklychallenge-club-86ff03fc4c991e427d7aba2aa3d1ec8abc9008fe.tar.gz
perlweeklychallenge-club-86ff03fc4c991e427d7aba2aa3d1ec8abc9008fe.tar.bz2
perlweeklychallenge-club-86ff03fc4c991e427d7aba2aa3d1ec8abc9008fe.zip
Adding a second way of doing it and benchmarking code
Diffstat (limited to 'challenge-191')
-rw-r--r--challenge-191/simon-proctor/raku/ch-1.raku45
1 files changed, 44 insertions, 1 deletions
diff --git a/challenge-191/simon-proctor/raku/ch-1.raku b/challenge-191/simon-proctor/raku/ch-1.raku
index 7fdeb0c10e..2f437997d5 100644
--- a/challenge-191/simon-proctor/raku/ch-1.raku
+++ b/challenge-191/simon-proctor/raku/ch-1.raku
@@ -2,22 +2,65 @@
multi sub MAIN ( "TEST" ) is hidden-from-USAGE {
use Test;
+ ok passes( [1] );
+ ok ! passes( [] );
ok ! passes( ( 1,2,3,4 ) );
ok passes( ( 1,2,0,5 ) );
ok passes( ( 2,6,3,1 ) );
ok ! passes( ( 4,5,2,3 ) );
ok ! passes( ( |(1..1000000) ) );
ok passes( ( |(1..1000000), 2000000 ) );
- ok passes( ( |(1..500000), 2000000, |(510000..1000000) ) );
+ ok ! passes( ( |(1..1000000), 2000000, 2000000 ) );
+ ok passes( ( |(1..1000000), 2000000 ).pick(*) );
+
+ ok faff( [1] );
+ ok ! faff( [] );
+ ok ! faff( ( 1,2,3,4 ) );
+ ok faff( ( 1,2,0,5 ) );
+ ok faff( ( 2,6,3,1 ) );
+ ok ! faff( ( 4,5,2,3 ) );
+ ok ! faff( ( |(1..1000000) ) );
+ ok faff( ( |(1..1000000), 2000000 ) );
+ ok ! faff( ( |(1..1000000), 2000000, 2000000 ) );
+ ok faff( ( |(1..1000000), 2000000 ).pick(*) );
done-testing;
}
+multi sub MAIN( "TIMING" ) is hidden-from-USAGE {
+ use Benchmark;
+ my @random = ( |(1..100000), 200000 ).pick(*);
+ say timethis(10000,"&passes(@random)").join(",");
+ say timethis(10000,"&faff(@random)").join(",");
+ @random = ( |(1..100000) ).pick(*);
+ say timethis(10000,"&passes(@random)").join(",");
+ say timethis(10000,"&faff(@random)").join(",");
+
+}
+
+multi sub passes ( @ where *.elems == 1 ) { True }
+multi sub passes ( @ where *.elems == 0 ) { False }
+
multi sub passes ( @list ) {
my @sorted = @list.sort;
return @sorted[*-1] >= @sorted[*-2] * 2;
}
+sub faff (@list) {
+ return False if ! @list;
+ return True if @list.elems == 1;
+
+ my ( $max, $next ) = @list[0,1];
+ for ( @list ) -> $new {
+ if ( $new > $max ) {
+ ( $max, $next ) = ( $new, $max );
+ } elsif ( $new > $next ) {
+ $next = $new;
+ }
+ }
+ return $max >= $next * 2;
+}
+
#|( Given a list of ints returns true if the largest element in the list
Is at least twice the size of the next largest element
Returns True or False)