From 1d0f1e2d0488a265833992c6c50abf6c8ccc7465 Mon Sep 17 00:00:00 2001 From: wanderdoc Date: Sun, 27 Sep 2020 15:28:44 +0200 Subject: Solutions to challenge-079. --- challenge-079/wanderdoc/perl/ch-1.pl | 35 ++++++++++++++++++ challenge-079/wanderdoc/perl/ch-2.pl | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 challenge-079/wanderdoc/perl/ch-1.pl create mode 100644 challenge-079/wanderdoc/perl/ch-2.pl diff --git a/challenge-079/wanderdoc/perl/ch-1.pl b/challenge-079/wanderdoc/perl/ch-1.pl new file mode 100644 index 0000000000..0c3faea887 --- /dev/null +++ b/challenge-079/wanderdoc/perl/ch-1.pl @@ -0,0 +1,35 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +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. + +Example 1: Input: $N = 4 Total set bit count: 1 + 1 + 2 + 1 = 5 +Output: Your script should print `5` as `5 % 1000000007 = 5`. + + +Example 2: Input: $N = 3 Total set bit count: 1 + 1 + 2 = 4 +Output: Your script should print `4` as `4 % 1000000007 = 4`. + +=cut +use Test::More; + +sub count_set_bits +{ + my $num = $_[0]; + my $set_bits = 0; + for my $i ( 1 .. $num ) + { + + my $binary = sprintf("%b", $i); + $set_bits += $binary =~ tr/1/1/; + } + return $set_bits; +} +is(count_set_bits(4), 5, 'Example 1'); +is(count_set_bits(3), 4, 'Example 2'); + +done_testing(); \ No newline at end of file diff --git a/challenge-079/wanderdoc/perl/ch-2.pl b/challenge-079/wanderdoc/perl/ch-2.pl new file mode 100644 index 0000000000..7a47932b48 --- /dev/null +++ b/challenge-079/wanderdoc/perl/ch-2.pl @@ -0,0 +1,72 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +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. +Example 1: Input: @N = (2, 1, 4, 1, 2, 5) +Looking at the above histogram, we can see, it can trap 1 unit of rain water between 1st and 3rd column. Similary it can trap 5 units of rain water betweem 3rd and last column. Therefore your script should print 6. + +Example 2 +Input: @N = (3, 1, 3, 1, 1, 5) +Looking at the above histogram, we can see, it can trap 2 units of rain water between 1st and 3rd column. Also it can trap 4 units of rain water between 3rd and last column. + +Therefore your script should print 6. +=cut + +use List::Util qw(min max); + +sub print_histogram # Challenge 075. +{ + my @arr = @_; + my $max = max(@arr); + my $offset = length($max); + for my $high ( reverse 1 .. $max ) + { + + my @hist = map {$_ >= $high ? '#' : ' '} @arr; + print $high, ' ' x $offset, join(' ', @hist), $/; + } + + my @underl = map '_', @arr, $max; + print join(' ', @underl), $/; + print ' ' x ($offset + 1), join(' ', @arr) , $/; +} + +sub estimate_water +{ + my @arr = @_; + + + my @left; + my @right; + my $volume = 0; + + $left[0] = $arr[0]; + for my $idx ( 1 .. $#arr ) + { + $left[$idx] = max($left[$idx - 1], $arr[$idx]); + + } + + $right[$#arr] = $arr[$#arr]; + for my $idx ( reverse 0 .. $#arr - 1 ) + { + $right[$idx] = max($right[$idx + 1], $arr[$idx]); + } + + + for my $idx ( 0 .. $#arr ) + { + $volume += min($left[$idx], $right[$idx]) - $arr[$idx]; + } + + return $volume; +} + + +print_histogram(2, 1, 4, 1, 2, 5); +print estimate_water(2, 1, 4, 1, 2, 5), $/; # 6 + +print_histogram(3, 1, 3, 1, 1, 5); +print estimate_water(3, 1, 3, 1, 1, 5), $/; # 6 \ No newline at end of file -- cgit