aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-079/ash/raku/ch-1.raku45
-rw-r--r--challenge-079/ash/raku/ch-1a.raku20
2 files changed, 65 insertions, 0 deletions
diff --git a/challenge-079/ash/raku/ch-1.raku b/challenge-079/ash/raku/ch-1.raku
new file mode 100644
index 0000000000..1e08b79b29
--- /dev/null
+++ b/challenge-079/ash/raku/ch-1.raku
@@ -0,0 +1,45 @@
+#!/usr/bin/env raku
+#
+# Task 1 from
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-079/#
+#
+# Comments:
+#
+# This program implements a fast algorithm.
+#
+# Output:
+#
+# $ raku ch-1.raku 42
+# 108
+#
+# $ raku ch-1.raku 123456789
+# 1644989771
+
+unit sub MAIN($n = 42, :v(:$verbose));
+
+my @scale = (1, 2 * * ...^ * > $n);
+
+my $total-bits = 0;
+for @scale -> $pwr {
+
+ my $fill = ($n + 1) / (2 * $pwr);
+ my $max = $pwr * 2;
+ say "\n$pwr: fill=$fill, max=$max" if $verbose;
+
+ my $fill-full = $fill.Int;
+ my $fill-frac = $fill - $fill-full;
+
+ my $bits-full = $fill-full * $pwr;
+ my $bits-frac = 0;
+
+ if $fill-frac > 0.5 {
+ $bits-frac = ($fill-frac - 0.5) * $max;
+ say "($fill-frac - 0.5) * $pwr" if $verbose;
+ }
+
+ my $bits = $bits-full + $bits-frac;
+ say "bits-full=$bits-full, bits-frac=$bits-frac, bits=$bits" if $verbose;
+
+ $total-bits += $bits;
+}
+say $total-bits;
diff --git a/challenge-079/ash/raku/ch-1a.raku b/challenge-079/ash/raku/ch-1a.raku
new file mode 100644
index 0000000000..c23fb1eea9
--- /dev/null
+++ b/challenge-079/ash/raku/ch-1a.raku
@@ -0,0 +1,20 @@
+#!/usr/bin/env raku
+#
+# Task 1 from
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-079/
+#
+# Comments:
+#
+# This is atraightforwad but slow (for big input numbers) solution.
+#
+# Output:
+#
+# $ raku ch-1a.raku 42
+# 108
+#
+# $ raku ch-1a.raku 500
+# 2222
+
+my $n = @*ARGS[0] // 42;
+
+say [+] ((.base(2) ~~ m:g/1/).elems for 1..$n);