aboutsummaryrefslogtreecommitdiff
path: root/challenge-075
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2020-08-24 12:12:19 +0100
committerRoger Bell_West <roger@firedrake.org>2020-08-24 12:12:19 +0100
commitc50e53354763a67539a2ab072936ac0f91ef8891 (patch)
tree7099ce48570d990184ace57f9476eab811b1082e /challenge-075
parentab2670bec6b5a091b61b3d3a6f6211cefa68a425 (diff)
downloadperlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.tar.gz
perlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.tar.bz2
perlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.zip
Solutions for challenge #75.
Diffstat (limited to 'challenge-075')
-rwxr-xr-xchallenge-075/roger-bell-west/perl/ch-1.pl44
-rwxr-xr-xchallenge-075/roger-bell-west/perl/ch-1v.pl53
-rwxr-xr-xchallenge-075/roger-bell-west/perl/ch-2.pl31
-rwxr-xr-xchallenge-075/roger-bell-west/perl/ch-2v.pl33
-rwxr-xr-xchallenge-075/roger-bell-west/python3/ch-1.py34
-rwxr-xr-xchallenge-075/roger-bell-west/python3/ch-2.py24
-rwxr-xr-xchallenge-075/roger-bell-west/raku/ch-1.p640
-rwxr-xr-xchallenge-075/roger-bell-west/raku/ch-2.p628
8 files changed, 287 insertions, 0 deletions
diff --git a/challenge-075/roger-bell-west/perl/ch-1.pl b/challenge-075/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..3b15b79437
--- /dev/null
+++ b/challenge-075/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,44 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(sum);
+
+use Test::More tests => 1;
+
+is(coinsum([1,2,4],6),
+ 6,
+ "example");
+
+sub coinsum {
+ my $c=shift;
+ my @c=@{$c};
+ my $s=shift;
+ my @m;
+ foreach (0..$#c) {
+ push @m,int($s/$c[$_]);
+ }
+ my @out;
+ my @b=(0) x scalar @c;
+ OUTER:
+ while (1) {
+ my $v=sum(map {$c[$_]*$b[$_]} (0..$#c));
+ if ($v==$s) {
+ push @out,\@b;
+ }
+ my $i=0;
+ while (1) {
+ $b[$i]++;
+ if ($b[$i]>$m[$i]) {
+ $b[$i]=0;
+ $i++;
+ if ($i>$#b) {
+ last OUTER;
+ }
+ } else {
+ last;
+ }
+ }
+ }
+ return scalar @out;
+}
diff --git a/challenge-075/roger-bell-west/perl/ch-1v.pl b/challenge-075/roger-bell-west/perl/ch-1v.pl
new file mode 100755
index 0000000000..aba16ad2e8
--- /dev/null
+++ b/challenge-075/roger-bell-west/perl/ch-1v.pl
@@ -0,0 +1,53 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(sum);
+
+coinsum([1,2,4],6);
+
+sub coinsum {
+ my $c=shift;
+ my @c=@{$c};
+ my $s=shift;
+ my @m;
+ foreach (0..$#c) {
+ push @m,int($s/$c[$_]);
+ }
+ my @out;
+ my @b=(0) x scalar @c;
+ OUTER:
+ while (1) {
+ my $v=sum(map {$c[$_]*$b[$_]} (0..$#c));
+ if ($v==$s) {
+ push @out,[@b];
+ }
+ my $i=0;
+ while (1) {
+ $b[$i]++;
+ if ($b[$i]>$m[$i]) {
+ $b[$i]=0;
+ $i++;
+ if ($i>$#b) {
+ last OUTER;
+ }
+ } else {
+ last;
+ }
+ }
+ }
+ my $o=scalar @out;
+ if ($o==1) {
+ print "There is 1 possible way to make sum $s.\n";
+ } else {
+ print "There are $o possible ways to make sum $s.\n";
+ }
+ my @index=('a'..'z');
+ foreach my $li (0..$#out) {
+ my @a;
+ foreach my $i (0..$#{$out[$li]}) {
+ push @a,($c[$i]) x $out[$li][$i];
+ }
+ print $index[$li].') ('.join(', ',@a).")\n";
+ }
+}
diff --git a/challenge-075/roger-bell-west/perl/ch-2.pl b/challenge-075/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..4be4fdcab5
--- /dev/null
+++ b/challenge-075/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(min);
+
+use Test::More tests => 2;
+
+is(lrhist(2,1,4,5,3,7),
+ 12,
+ "example 1");
+
+is(lrhist(3,2,3,5,7,5),
+ 15,
+ "example 2");
+
+sub lrhist {
+ my @c=@_;
+ my $bestarea=0;
+ my @n=(0,0);
+ foreach my $a (0..$#c-1) {
+ foreach my $b ($a+1..$#c) {
+ my $area=($b-$a+1)*min(@c[$a..$b]);
+ if ($area>$bestarea) {
+ $bestarea=$area;
+ @n=($a,$b);
+ }
+ }
+ }
+ return $bestarea;
+}
diff --git a/challenge-075/roger-bell-west/perl/ch-2v.pl b/challenge-075/roger-bell-west/perl/ch-2v.pl
new file mode 100755
index 0000000000..fa7c6174af
--- /dev/null
+++ b/challenge-075/roger-bell-west/perl/ch-2v.pl
@@ -0,0 +1,33 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use List::Util qw(min max);
+
+lrhist(2,1,4,5,3,7);
+
+lrhist(3,2,3,5,7,5);
+
+sub lrhist {
+ my @c=@_;
+ my $bestarea=0;
+ my @n=(0,0);
+ foreach my $a (0..$#c-1) {
+ foreach my $b ($a+1..$#c) {
+ my $area=($b-$a+1)*min(@c[$a..$b]);
+ if ($area>$bestarea) {
+ $bestarea=$area;
+ @n=($a,$b);
+ }
+ }
+ }
+ my $mx=max(@c);
+ 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 {($c[$_]>=$r?'#' x $cw:' ' x $cw)} (0..$#c);
+ print join(' ',@row),"\n";
+ }
+ print join(' ',('-' x $cw) x (1+scalar @c)),"\n";
+ print join(' ',map {sprintf('%'.$cw.'s',$_)} ('',@c)),"\n";
+}
diff --git a/challenge-075/roger-bell-west/python3/ch-1.py b/challenge-075/roger-bell-west/python3/ch-1.py
new file mode 100755
index 0000000000..42d6b8dac2
--- /dev/null
+++ b/challenge-075/roger-bell-west/python3/ch-1.py
@@ -0,0 +1,34 @@
+#! /usr/bin/python3
+
+import unittest
+
+def coinsum(c,s):
+ m=list()
+ for i in range(len(c)):
+ m.append(int(s/c[i]))
+ out=list()
+ b=[0 for i in range(len(c))]
+ of=1
+ while of:
+ v=sum(c[i]*b[i] for i in range(len(c)))
+ if v==s:
+ out.append(b.copy())
+ i=0
+ while 1:
+ b[i]+=1
+ if b[i]>m[i]:
+ b[i]=0
+ i+=1
+ if i>len(b)-1:
+ of=0
+ break;
+ else:
+ break;
+ return len(out)
+
+class TestMajority(unittest.TestCase):
+
+ def test_ex(self):
+ self.assertEqual(coinsum((1,2,4),6),6,'example')
+
+unittest.main()
diff --git a/challenge-075/roger-bell-west/python3/ch-2.py b/challenge-075/roger-bell-west/python3/ch-2.py
new file mode 100755
index 0000000000..a87d8288fa
--- /dev/null
+++ b/challenge-075/roger-bell-west/python3/ch-2.py
@@ -0,0 +1,24 @@
+#! /usr/bin/python3
+
+import unittest
+
+def lrhist(c):
+ bestarea=0
+ n=[0,0]
+ for a in range(len(c)-1):
+ for b in range(a+1,len(c)):
+ area=(b-a+1)*min(c[h] for h in range(a,b+1))
+ if (area>bestarea):
+ bestarea=area
+ n=[a,b]
+ return bestarea
+
+class TestMajority(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(lrhist((2,1,4,5,3,7)),12,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(lrhist((3,2,3,5,7,5)),15,'example 2')
+
+unittest.main()
diff --git a/challenge-075/roger-bell-west/raku/ch-1.p6 b/challenge-075/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..5a57bb4d5a
--- /dev/null
+++ b/challenge-075/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,40 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 1;
+
+is(coinsum((1,2,4),6),
+ 6,
+ "example");
+
+sub coinsum(@c,$s) {
+ my @m;
+ for (0..@c.end) {
+ push @m,floor($s/@c[$_]);
+ }
+ my @out;
+ my @b=(0) xx @c.elems;
+ my $of=1;
+ while ($of) {
+ my $v=sum(map {@c[$_]*@b[$_]}, (0..@c.end));
+ if ($v==$s) {
+ push @out,@b.clone;
+ }
+ my $i=0;
+ while (1) {
+ @b[$i]++;
+ if (@b[$i]>@m[$i]) {
+ @b[$i]=0;
+ $i++;
+ if ($i>@b.end) {
+ $of=0;
+ last;
+ }
+ } else {
+ last;
+ }
+ }
+ }
+ return @out.elems;
+}
diff --git a/challenge-075/roger-bell-west/raku/ch-2.p6 b/challenge-075/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..123c9ecc71
--- /dev/null
+++ b/challenge-075/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,28 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(lrhist((2,1,4,5,3,7)),
+ 12,
+ "example 1");
+
+is(lrhist((3,2,3,5,7,5)),
+ 15,
+ "example 2");
+
+sub lrhist(@c) {
+ my $bestarea=0;
+ my @n=(0,0);
+ for (0..@c.end-1) -> $a {
+ for ($a+1..@c.end) -> $b {
+ my $area=($b-$a+1)*min(@c[$a..$b]);
+ if ($area>$bestarea) {
+ $bestarea=$area;
+ @n=($a,$b);
+ }
+ }
+ }
+ return $bestarea;
+}