From 646831c810b88ebca1ae9100232da81ad1e3fe2c Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 11:30:33 +0200 Subject: initial --- challenge-079/markus-holzer/raku/ch-1.raku | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 challenge-079/markus-holzer/raku/ch-1.raku (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/ch-1.raku b/challenge-079/markus-holzer/raku/ch-1.raku new file mode 100644 index 0000000000..8bf2ac453b --- /dev/null +++ b/challenge-079/markus-holzer/raku/ch-1.raku @@ -0,0 +1,8 @@ +use experimental :cached; + +unit sub MAIN( Int $N ); + +sub bits( $n ) is cached { + $n !%% 2 + bits( $n div 2 ) if $n > 0 || 0 } + +say ($N...1).map( &bits ).sum % 1000000007; \ No newline at end of file -- cgit From 156b11c445341e9d028777bb41ec506f69fec3a4 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 15:31:34 +0200 Subject: way too long --- challenge-079/markus-holzer/raku/ch-2.raku | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 challenge-079/markus-holzer/raku/ch-2.raku (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/ch-2.raku b/challenge-079/markus-holzer/raku/ch-2.raku new file mode 100644 index 0000000000..d64fc1a83a --- /dev/null +++ b/challenge-079/markus-holzer/raku/ch-2.raku @@ -0,0 +1,10 @@ +unit sub MAIN( *@N where @N.all ~~ Int ); + +say (@N.max...0) + .map( -> $height { + @N.pairs.grep( *.value >= $height ).map: *.key }) + .map( -> $indexes { + $indexes.rotor(2 => -1) }) + .map( -> $index-pairs { + $index-pairs.map({ .[1] - .[0] - 1 if .elems }).sum }) + .sum; \ No newline at end of file -- cgit From da89e65b16be36928445f92d5443dfd6801c76f2 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 15:46:47 +0200 Subject: somewhat clearer --- challenge-079/markus-holzer/raku/ch-2.raku | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/ch-2.raku b/challenge-079/markus-holzer/raku/ch-2.raku index d64fc1a83a..864734a511 100644 --- a/challenge-079/markus-holzer/raku/ch-2.raku +++ b/challenge-079/markus-holzer/raku/ch-2.raku @@ -1,10 +1,10 @@ unit sub MAIN( *@N where @N.all ~~ Int ); +sub index-height { @N.pairs.grep( *.value >= $^height ).map: *.key } +sub index-diff { $^indexes.map({ .[1] - .[0] - 1 if .elems }).sum } + say (@N.max...0) - .map( -> $height { - @N.pairs.grep( *.value >= $height ).map: *.key }) - .map( -> $indexes { - $indexes.rotor(2 => -1) }) - .map( -> $index-pairs { - $index-pairs.map({ .[1] - .[0] - 1 if .elems }).sum }) - .sum; \ No newline at end of file + .map( &index-height ) + .map( *.rotor: 2 => -1 ) + .map( &index-diff ) + .sum; \ No newline at end of file -- cgit From 4968031a8c17661761edfb6d94fef6bd3169722c Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 16:16:39 +0200 Subject: nicer --- challenge-079/markus-holzer/raku/ch-2.raku | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/ch-2.raku b/challenge-079/markus-holzer/raku/ch-2.raku index 864734a511..532d2505a3 100644 --- a/challenge-079/markus-holzer/raku/ch-2.raku +++ b/challenge-079/markus-holzer/raku/ch-2.raku @@ -1,10 +1,10 @@ unit sub MAIN( *@N where @N.all ~~ Int ); -sub index-height { @N.pairs.grep( *.value >= $^height ).map: *.key } -sub index-diff { $^indexes.map({ .[1] - .[0] - 1 if .elems }).sum } +sub index-find { @N.pairs.grep( *.value >= $^h ).map: *.key } +sub index-diff { ($^i.cache.skip >>->> $^i).map: * - 1 } say (@N.max...0) - .map( &index-height ) - .map( *.rotor: 2 => -1 ) + .map( &index-find ) .map( &index-diff ) + .flat .sum; \ No newline at end of file -- cgit From 10f8946866d030906f6bea294e1bf90084360279 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 20:00:28 +0200 Subject: improved and benchmarked --- challenge-079/markus-holzer/raku/bench.raku | 32 +++++++++++++++++++++++++++++ challenge-079/markus-holzer/raku/ch-1.raku | 9 ++++---- challenge-079/markus-holzer/raku/ch-2.raku | 2 +- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 challenge-079/markus-holzer/raku/bench.raku (limited to 'challenge-079') 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 ) -- cgit From 0eaf9a519d188731cefdb41e66be775ed2392633 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 20:04:52 +0200 Subject: actually look at the argument --- challenge-079/markus-holzer/raku/bench.raku | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/bench.raku b/challenge-079/markus-holzer/raku/bench.raku index 77ad224a3b..f435d3a028 100644 --- a/challenge-079/markus-holzer/raku/bench.raku +++ b/challenge-079/markus-holzer/raku/bench.raku @@ -1,6 +1,6 @@ use Bench; -my $n = @*ARGS[0] || 42; +my $N = @*ARGS[0] || 42; #say i($n); #say r($n); @@ -25,8 +25,8 @@ sub l { $^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 + base2-with-indices => { i($N) }, + base2-with-regex => { r($N) }, + div2-recursive => { f($N) }, + kernighan => { k($N) }, + lookup-recursive => { l($N) }}) \ No newline at end of file -- cgit From d6d15ced633043d544d0deed31eaba48fbc61a59 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 20:05:29 +0200 Subject: actually look at the argument --- challenge-079/markus-holzer/raku/bench.raku | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/bench.raku b/challenge-079/markus-holzer/raku/bench.raku index f435d3a028..972836ee07 100644 --- a/challenge-079/markus-holzer/raku/bench.raku +++ b/challenge-079/markus-holzer/raku/bench.raku @@ -2,11 +2,11 @@ use Bench; my $N = @*ARGS[0] || 42; -#say i($n); -#say r($n); -#say f($n); -#say k($n); -#say l($n); +#say i($N); +#say r($N); +#say f($N); +#say k($N); +#say l($N); sub i { +$^n.base(2).indices(1) } -- cgit From 6a9cf80ad7714090fcdf2d389f2ba4c4046b46a7 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Mon, 21 Sep 2020 23:08:34 +0200 Subject: bug --- challenge-079/markus-holzer/raku/bench.raku | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'challenge-079') diff --git a/challenge-079/markus-holzer/raku/bench.raku b/challenge-079/markus-holzer/raku/bench.raku index 972836ee07..1ab34ceea2 100644 --- a/challenge-079/markus-holzer/raku/bench.raku +++ b/challenge-079/markus-holzer/raku/bench.raku @@ -1,6 +1,6 @@ use Bench; -my $N = @*ARGS[0] || 42; +unit sub MAIN(Int $N = 42); #say i($N); #say r($N); @@ -24,7 +24,7 @@ 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, { +Bench.new.timethese( 10000, { base2-with-indices => { i($N) }, base2-with-regex => { r($N) }, div2-recursive => { f($N) }, -- cgit