aboutsummaryrefslogtreecommitdiff
path: root/challenge-079
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-09-21 22:16:52 +0100
committerGitHub <noreply@github.com>2020-09-21 22:16:52 +0100
commit4ea66a8bc51115f617734bf1e2d3e221dafc2c5f (patch)
tree7539bc6f8fceb2bf911244dbb9e7c5b9e02a0628 /challenge-079
parenta5ce0795c67671a0ea1e5d8c5e63e1402cf5be2d (diff)
parentbec3ea4022d39b97f0c7e3892cf0b46319746883 (diff)
downloadperlweeklychallenge-club-4ea66a8bc51115f617734bf1e2d3e221dafc2c5f.tar.gz
perlweeklychallenge-club-4ea66a8bc51115f617734bf1e2d3e221dafc2c5f.tar.bz2
perlweeklychallenge-club-4ea66a8bc51115f617734bf1e2d3e221dafc2c5f.zip
Merge pull request #2339 from Firedrake/rogerbw-challenge-079
Answers to challenge #79.
Diffstat (limited to 'challenge-079')
-rwxr-xr-xchallenge-079/roger-bell-west/perl/ch-1.pl24
-rwxr-xr-xchallenge-079/roger-bell-west/perl/ch-2.pl41
-rwxr-xr-xchallenge-079/roger-bell-west/python/ch-1.py21
-rwxr-xr-xchallenge-079/roger-bell-west/python/ch-2.py48
-rwxr-xr-xchallenge-079/roger-bell-west/raku/ch-1.p622
-rwxr-xr-xchallenge-079/roger-bell-west/raku/ch-2.p636
6 files changed, 192 insertions, 0 deletions
diff --git a/challenge-079/roger-bell-west/perl/ch-1.pl b/challenge-079/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..e20c92f5e2
--- /dev/null
+++ b/challenge-079/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Math::GMPz qw( :mpz );
+
+use Test::More tests => 2;
+
+is(csb(4),5,'example 1');
+is(csb(3),4,'example 2');
+
+sub csb {
+ my $tot=shift;
+ my $n=Math::GMPz->new(1);
+ my $bits=Math::GMPz->new(0);
+ my $m=Math::GMPz->new(1000000007);
+ while ($n <= $tot) {
+ Rmpz_add_ui($bits,$bits,Rmpz_popcount(Math::GMPz->new($n)));
+ Rmpz_mod($bits,$bits,$m);
+ Rmpz_add_ui($n,$n,1);
+ }
+ return Rmpz_get_str($bits,10);
+}
diff --git a/challenge-079/roger-bell-west/perl/ch-2.pl b/challenge-079/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..e5b9e02893
--- /dev/null
+++ b/challenge-079/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,41 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use List::Util qw(min max);
+
+use Test::More tests => 2;
+
+is(capacity([2,1,4,1,2,5]),6,'example 1');
+is(capacity([3,1,3,1,1,5]),6,'example 2');
+
+histo([2,1,4,1,2,5]);
+histo([3,1,3,1,1,5]);
+
+sub capacity {
+ my @n=@{shift @_};
+ my $cap=0;
+ foreach my $r (min(@n)..max(@n)) {
+ my @b=grep {$n[$_]>=$r} (0..$#n);
+ if (scalar @b > 1) {
+ foreach my $i (0..$#b-1) {
+ $cap += $b[$i+1]-$b[$i]-1;
+ }
+ }
+ }
+ return $cap;
+}
+
+sub histo {
+ my @n=@{shift @_};
+ my $mx=max(@n);
+ my $cw=int(log($mx+1)/log(10)+.9999);
+ for (my $r=$mx;$r>0;$r--) {
+ my @row=(sprintf('%'.$cw.'d',$r));
+ push @row,map {($n[$_]>=$r?'#' x $cw:' ' x $cw)} (0..$#n);
+ print join(' ',@row),"\n";
+ }
+ print join(' ',('-' x $cw) x (1+scalar @n)),"\n";
+ print join(' ',map {sprintf('%'.$cw.'s',$_)} ('',@n)),"\n";
+}
diff --git a/challenge-079/roger-bell-west/python/ch-1.py b/challenge-079/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..c3c5aff095
--- /dev/null
+++ b/challenge-079/roger-bell-west/python/ch-1.py
@@ -0,0 +1,21 @@
+#! /usr/bin/python
+
+import unittest
+
+def csb(tot):
+ bits=0
+ m=1000000007;
+ for n in range(1,tot+1):
+ bits += bin(n).count("1")
+ bits %= m
+ return bits
+
+class TestCsb(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(csb(4),5,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(csb(3),4,'example 2')
+
+unittest.main()
diff --git a/challenge-079/roger-bell-west/python/ch-2.py b/challenge-079/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..04f30f729d
--- /dev/null
+++ b/challenge-079/roger-bell-west/python/ch-2.py
@@ -0,0 +1,48 @@
+#! /usr/bin/python
+
+import unittest
+
+from math import log10
+
+def capacity(n):
+ cap=0
+ for r in range(min(n),max(n)+1):
+ b=[i for i in range(0,len(n)) if n[i] >= r]
+ if(len(b)>1):
+ for i in range(0,len(b)-1):
+ cap += b[i+1]-b[i]-1
+ return cap
+
+def histo(n):
+ mx=max(n)
+ cw=int(log10(mx+1)+.9999);
+ for r in reversed(range(1,mx+1)):
+ row=list()
+ row.append(format(r,str(cw)))
+ for i in range(0,len(n)):
+ s = ' '
+ if(n[i] >= r):
+ s = '#'
+ s *= cw
+ row.append(s)
+ print(' '.join(row))
+ s='-' * cw;
+ print(' '.join([s for i in range(0,len(n)+1)]))
+ row=list()
+ row.append(' ' * cw)
+ for i in n:
+ row.append(format(i,str(cw)))
+ print(' '.join(row))
+
+histo((2,1,4,1,2,5));
+histo((3,1,3,1,1,5));
+
+class TestCapacity(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(capacity((2,1,4,1,2,5)),6,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(capacity((3,1,3,1,1,5)),6,'example 2')
+
+unittest.main()
diff --git a/challenge-079/roger-bell-west/raku/ch-1.p6 b/challenge-079/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..dcf9aad5d3
--- /dev/null
+++ b/challenge-079/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,22 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(csb(4),5,'example 1');
+is(csb(3),4,'example 2');
+
+sub csb($tot) {
+ my $bits=0;
+ my $m=1000000007;
+ for 1..$tot -> $n {
+ my $k=$n;
+ while ($k > 0) {
+ $bits += $k +& 1;
+ $k +>= 1;
+ }
+ $bits %= $m;
+ }
+ return $bits;
+}
diff --git a/challenge-079/roger-bell-west/raku/ch-2.p6 b/challenge-079/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..631e7caf91
--- /dev/null
+++ b/challenge-079/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,36 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(capacity((2,1,4,1,2,5)),6,'example 1');
+is(capacity((3,1,3,1,1,5)),6,'example 2');
+
+histo((2,1,4,1,2,5));
+histo((3,1,3,1,1,5));
+
+sub capacity(@n) {
+ my $cap=0;
+ for (min(@n)..max(@n)) -> $r {
+ my @b=grep {@n[$_] >= $r}, (0..@n.end);
+ if (@b.elems > 1) {
+ for (0..@b.end-1) -> $i {
+ $cap += @b[$i+1]-@b[$i]-1;
+ }
+ }
+ }
+ return $cap;
+}
+
+sub histo(@n) {
+ my $mx=max(@n);
+ my $cw=floor(log($mx+1)/log(10)+.9999);
+ loop (my $r=$mx;$r>0;$r--) {
+ my @row=(sprintf('%' ~ $cw ~ 'd',$r));
+ push @row,map {(@n[$_]>=$r ?? '#' x $cw !! ' ' x $cw)}, (0..@n.end);
+ say join(' ',@row);
+ }
+ say join(' ',('-' x $cw) xx (1+@n.elems));
+ say join(' ',map {sprintf('%' ~ $cw ~ 's',$_)}, ('',@n).flat);
+}