aboutsummaryrefslogtreecommitdiff
path: root/challenge-079
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2020-09-27 17:52:03 +0200
committerAlexander Pankoff <ccntrq@screenri.de>2020-09-27 17:59:58 +0200
commitd50b4432a6f41cbba1450fa95a6f8fbaa936d667 (patch)
tree2cae59c13fd8b35fbf1f0e89f60f665885e48afa /challenge-079
parentea02e89c6b72f106f5476901e05baa5a3984f33f (diff)
downloadperlweeklychallenge-club-d50b4432a6f41cbba1450fa95a6f8fbaa936d667.tar.gz
perlweeklychallenge-club-d50b4432a6f41cbba1450fa95a6f8fbaa936d667.tar.bz2
perlweeklychallenge-club-d50b4432a6f41cbba1450fa95a6f8fbaa936d667.zip
add solutions for challenge-079
Diffstat (limited to 'challenge-079')
-rw-r--r--challenge-079/alexander-pankoff/README5
-rwxr-xr-xchallenge-079/alexander-pankoff/perl/ch-1.pl42
-rwxr-xr-xchallenge-079/alexander-pankoff/perl/ch-2.pl71
3 files changed, 118 insertions, 0 deletions
diff --git a/challenge-079/alexander-pankoff/README b/challenge-079/alexander-pankoff/README
index 41f67807ac..f1aacf3dba 100644
--- a/challenge-079/alexander-pankoff/README
+++ b/challenge-079/alexander-pankoff/README
@@ -1 +1,6 @@
Solution by Alexander Pankoff
+
+# ch-1
+
+Aproach taken from:
+https://www.geeksforgeeks.org/count-total-set-bits-in-all-numbers-from-1-to-n/
diff --git a/challenge-079/alexander-pankoff/perl/ch-1.pl b/challenge-079/alexander-pankoff/perl/ch-1.pl
new file mode 100755
index 0000000000..98d0f946a5
--- /dev/null
+++ b/challenge-079/alexander-pankoff/perl/ch-1.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+#
+# You are given a positive number $N.
+#
+# Write a script to count the total numbrer of set bits of the binary
+# representations of all numbers from 1 to $N and return
+# $total_count_set_bit % 1000000007.
+
+my ($N) = @ARGV;
+
+say count_set_bits($N) % 1000000007;
+
+sub count_set_bits($n) {
+ my $count = 0;
+ my $i = 0;
+
+ while ( (1 << $i) <= $n ) {
+ my $set = 0;
+ my $change_after = 1 << $i;
+ for ( 0 .. $n ) {
+ $count += $set;
+ if ( $change_after == 1 ) {
+ $set = !$set;
+ $change_after = 1 << $i;
+ }
+ else {
+ $change_after--;
+
+ }
+ }
+ $i++;
+ }
+
+ return $count;
+}
diff --git a/challenge-079/alexander-pankoff/perl/ch-2.pl b/challenge-079/alexander-pankoff/perl/ch-2.pl
new file mode 100755
index 0000000000..2287d6d220
--- /dev/null
+++ b/challenge-079/alexander-pankoff/perl/ch-2.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+
+use List::Util qw(min max sum0 head);
+
+# You are given an array of positive numbers @N.
+#
+# Write a script to represent it as Histogram Chart and find out how much water it can trap.
+
+use constant DEBUG => $ENV{DEBUG} // 0;
+
+my @N = @ARGV;
+
+print_chart(@N);
+say calculate_volume(@N);
+
+sub calculate_volume(@chart) {
+
+ my $volume = 0;
+ my $last = 0;
+ my @bucket;
+
+ for my $i ( 0 .. $#chart ) {
+
+ my $cur = $chart[$i];
+ if ( !@bucket && $last > $cur ) {
+ push @bucket, $last;
+ }
+
+ if (@bucket) {
+ push @bucket, $cur;
+ if ( $cur >= $bucket[0] || $cur >= max( @chart[ $i .. $#chart ] ) )
+ {
+ $volume += bucket_volume(@bucket);
+ @bucket = ();
+ }
+ }
+
+ $last = $cur;
+ $i++;
+ }
+
+ return $volume;
+
+}
+
+sub bucket_volume(@bucket) {
+
+ my $lwall = shift(@bucket);
+ my $rwall = pop(@bucket);
+ my $bucket_height = min( $lwall, $rwall );
+ return sum0( map { $bucket_height - $_ } @bucket );
+}
+
+sub print_chart (@chart) {
+
+ my $height = max(@chart);
+
+ for my $line ( reverse( 1 .. $height ) ) {
+ say join( " ", $line, ( map { $_ < $line ? ' ' : '#' } @chart ) );
+ }
+
+ say join( "-", map { '-' } 1, @chart );
+ say join( " ", ' ', @chart );
+}