diff options
| author | Roger Bell_West <roger@firedrake.org> | 2020-08-24 12:12:19 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2020-08-24 12:12:19 +0100 |
| commit | c50e53354763a67539a2ab072936ac0f91ef8891 (patch) | |
| tree | 7099ce48570d990184ace57f9476eab811b1082e /challenge-075 | |
| parent | ab2670bec6b5a091b61b3d3a6f6211cefa68a425 (diff) | |
| download | perlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.tar.gz perlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.tar.bz2 perlweeklychallenge-club-c50e53354763a67539a2ab072936ac0f91ef8891.zip | |
Solutions for challenge #75.
Diffstat (limited to 'challenge-075')
| -rwxr-xr-x | challenge-075/roger-bell-west/perl/ch-1.pl | 44 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/perl/ch-1v.pl | 53 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/perl/ch-2.pl | 31 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/perl/ch-2v.pl | 33 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/python3/ch-1.py | 34 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/python3/ch-2.py | 24 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/raku/ch-1.p6 | 40 | ||||
| -rwxr-xr-x | challenge-075/roger-bell-west/raku/ch-2.p6 | 28 |
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; +} |
