From 70fd19ce09e8a169cb21f2d53c4d52b61372f85e Mon Sep 17 00:00:00 2001 From: Andrew Shitov Date: Mon, 21 Sep 2020 23:01:17 +0200 Subject: ash 079-1 --- challenge-079/ash/raku/ch-1.raku | 45 +++++++++++++++++++++++++++++++++++++++ challenge-079/ash/raku/ch-1a.raku | 20 +++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 challenge-079/ash/raku/ch-1.raku create mode 100644 challenge-079/ash/raku/ch-1a.raku 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); -- cgit