diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2020-09-27 17:52:03 +0200 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2020-09-27 17:59:58 +0200 |
| commit | d50b4432a6f41cbba1450fa95a6f8fbaa936d667 (patch) | |
| tree | 2cae59c13fd8b35fbf1f0e89f60f665885e48afa /challenge-079 | |
| parent | ea02e89c6b72f106f5476901e05baa5a3984f33f (diff) | |
| download | perlweeklychallenge-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/README | 5 | ||||
| -rwxr-xr-x | challenge-079/alexander-pankoff/perl/ch-1.pl | 42 | ||||
| -rwxr-xr-x | challenge-079/alexander-pankoff/perl/ch-2.pl | 71 |
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 ); +} |
