aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus "Holli" Holzer <holli.holzer@gmail.com>2020-09-21 20:00:28 +0200
committerMarkus "Holli" Holzer <holli.holzer@gmail.com>2020-09-21 20:00:28 +0200
commit10f8946866d030906f6bea294e1bf90084360279 (patch)
tree5626b49ca95a821ed9cb1251f1dd539fd047b4af
parent4968031a8c17661761edfb6d94fef6bd3169722c (diff)
downloadperlweeklychallenge-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.raku32
-rw-r--r--challenge-079/markus-holzer/raku/ch-1.raku9
-rw-r--r--challenge-079/markus-holzer/raku/ch-2.raku2
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 )