diff options
| author | Markus "Holli" Holzer <holli.holzer@gmail.com> | 2020-09-21 20:00:28 +0200 |
|---|---|---|
| committer | Markus "Holli" Holzer <holli.holzer@gmail.com> | 2020-09-21 20:00:28 +0200 |
| commit | 10f8946866d030906f6bea294e1bf90084360279 (patch) | |
| tree | 5626b49ca95a821ed9cb1251f1dd539fd047b4af | |
| parent | 4968031a8c17661761edfb6d94fef6bd3169722c (diff) | |
| download | perlweeklychallenge-club-10f8946866d030906f6bea294e1bf90084360279.tar.gz perlweeklychallenge-club-10f8946866d030906f6bea294e1bf90084360279.tar.bz2 perlweeklychallenge-club-10f8946866d030906f6bea294e1bf90084360279.zip | |
improved and benchmarked
| -rw-r--r-- | challenge-079/markus-holzer/raku/bench.raku | 32 | ||||
| -rw-r--r-- | challenge-079/markus-holzer/raku/ch-1.raku | 9 | ||||
| -rw-r--r-- | challenge-079/markus-holzer/raku/ch-2.raku | 2 |
3 files changed, 37 insertions, 6 deletions
diff --git a/challenge-079/markus-holzer/raku/bench.raku b/challenge-079/markus-holzer/raku/bench.raku new file mode 100644 index 0000000000..77ad224a3b --- /dev/null +++ b/challenge-079/markus-holzer/raku/bench.raku @@ -0,0 +1,32 @@ +use Bench; + +my $n = @*ARGS[0] || 42; + +#say i($n); +#say r($n); +#say f($n); +#say k($n); +#say l($n); + +sub i { + +$^n.base(2).indices(1) } + +sub r { + +($^n.base(2) ~~ m:g/1/) } + +sub f { + $^n == 0 ?? 0 !! $^n !%% 2 + f( $^n div 2 ) } + +sub k($n is copy) { + my $c = 0; while $n != 0 { $n = $n +& ($n-1); $c++ }; $c } + +sub l { + state @b = 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4; + $^n == 0 ?? 0 !! @b[ $^n +& 0xf ] + l($^n +> 4) } + +Bench.new.timethese( 100000, { + base2-with-indices => { i(42) }, + base2-with-regex => { r(42) }, + div2-recursive => { f(42) }, + kernighan => { k(42) }, + lookup-recursive => { l(42) }})
\ No newline at end of file diff --git a/challenge-079/markus-holzer/raku/ch-1.raku b/challenge-079/markus-holzer/raku/ch-1.raku index 8bf2ac453b..592d814445 100644 --- a/challenge-079/markus-holzer/raku/ch-1.raku +++ b/challenge-079/markus-holzer/raku/ch-1.raku @@ -1,8 +1,7 @@ -use experimental :cached; - unit sub MAIN( Int $N ); -sub bits( $n ) is cached { - $n !%% 2 + bits( $n div 2 ) if $n > 0 || 0 } +# This is not only the simplest, but also a quite fast solution +# It only loses (sometimes) to the kernighan algorithm +# See bench.raku in this directory -say ($N...1).map( &bits ).sum % 1000000007;
\ No newline at end of file +say ($N...1).map( + *.base(2).indices(1) ).sum % 1000000007
\ No newline at end of file diff --git a/challenge-079/markus-holzer/raku/ch-2.raku b/challenge-079/markus-holzer/raku/ch-2.raku index 532d2505a3..d674dca8af 100644 --- a/challenge-079/markus-holzer/raku/ch-2.raku +++ b/challenge-079/markus-holzer/raku/ch-2.raku @@ -1,7 +1,7 @@ unit sub MAIN( *@N where @N.all ~~ Int ); sub index-find { @N.pairs.grep( *.value >= $^h ).map: *.key } -sub index-diff { ($^i.cache.skip >>->> $^i).map: * - 1 } +sub index-diff { ($^i.cache.skip >>->> $^i).map: * - 1 } say (@N.max...0) .map( &index-find ) |
