diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-08-04 10:49:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-04 10:49:47 +0100 |
| commit | f6fa95c6519eb9085ced53d41af473d13f7242c6 (patch) | |
| tree | e8ee5a4c994fc78d0d2e3fa4390933cff19b0798 | |
| parent | 255eb8afa4cbf142cd9eabc953733cd6b23e04c7 (diff) | |
| parent | 05acfcc1bac0582eddfc7e74b1c41c5ee007838e (diff) | |
| download | perlweeklychallenge-club-f6fa95c6519eb9085ced53d41af473d13f7242c6.tar.gz perlweeklychallenge-club-f6fa95c6519eb9085ced53d41af473d13f7242c6.tar.bz2 perlweeklychallenge-club-f6fa95c6519eb9085ced53d41af473d13f7242c6.zip | |
Merge pull request #4652 from Firedrake/rogerbw-challenge-124
Solutions for challenge #124
| -rwxr-xr-x | challenge-124/roger-bell-west/perl/ch-1.pl | 26 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/perl/ch-2.pl | 39 | ||||
| -rw-r--r-- | challenge-124/roger-bell-west/postscript/ch-1.ps | 20 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/python/ch-1.py | 17 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/python/ch-2.py | 31 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/raku/ch-1.p6 | 20 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/raku/ch-2.p6 | 32 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/ruby/ch-1.rb | 19 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/ruby/ch-2.rb | 35 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/rust/ch-1.rs | 22 | ||||
| -rwxr-xr-x | challenge-124/roger-bell-west/rust/ch-2.rs | 37 |
11 files changed, 298 insertions, 0 deletions
diff --git a/challenge-124/roger-bell-west/perl/ch-1.pl b/challenge-124/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..02e957dd5c --- /dev/null +++ b/challenge-124/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,26 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use List::Util qw(max); + +my $char='^'; +my @shape=(3,-3,-4,-5,-5,-5,-5,-5,-4,-3,3,1,1,1,3,1,1); +my $mx=max(map {abs($_)} @shape); + +foreach my $row (@shape) { + my $line; + if ($row>0) { + $line=$char x $row; + } else { + $line=(' ' x -$row).$char; + } + my $ll=length($line); + if ($ll <= $mx) { + $line .= ' ' x ($mx-$ll+1); + } + my $f=reverse $line; + substr($f,-1)=''; + print "$f$line\n"; +} diff --git a/challenge-124/roger-bell-west/perl/ch-2.pl b/challenge-124/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..8bd9d0c671 --- /dev/null +++ b/challenge-124/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,39 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Algorithm::Combinatorics qw(combinations); +use List::Util qw(sum); + +tow([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]); +print "\n"; + +tow([10, -15, 20, 30, -25, 0, 5, 40, -5]); + +sub tow { + my $n=shift; + my $target=int(sum(@{$n})/2); + my $k=int((scalar @{$n})/2); + my $bestval=-1; + my $bestset; + foreach my $set (combinations($n,$k)) { + my $l=abs($target-sum(@{$set})); + if ($bestval<0 || $l < $bestval) { + $bestval=$l; + $bestset=[@{$set}]; + } + } + my @o=([],[]); + my %r=map {$_ => 1} @{$bestset}; + foreach my $m (@{$n}) { + if (exists $r{$m}) { + push @{$o[1]},$m; + } else { + push @{$o[0]},$m; + } + } + foreach my $i (0,1) { + print "(",join(', ',@{$o[$i]}),")\n"; + } +} diff --git a/challenge-124/roger-bell-west/postscript/ch-1.ps b/challenge-124/roger-bell-west/postscript/ch-1.ps new file mode 100644 index 0000000000..ea526ab327 --- /dev/null +++ b/challenge-124/roger-bell-west/postscript/ch-1.ps @@ -0,0 +1,20 @@ +%! + +10 setlinewidth + +gsave +300 300 translate + +/size 100 def + +newpath +0 0 size 0 360 arc +0 size neg moveto +0 size neg 2 mul lineto +size neg 2 div size neg 1.5 mul moveto +size 2 div size neg 1.5 mul lineto +stroke + +grestore + +showpage diff --git a/challenge-124/roger-bell-west/python/ch-1.py b/challenge-124/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..61b9eddc7f --- /dev/null +++ b/challenge-124/roger-bell-west/python/ch-1.py @@ -0,0 +1,17 @@ +#! /usr/bin/python3 + +char="^" +shape=[3,-3,-4,-5,-5,-5,-5,-5,-4,-3,3,1,1,1,3,1,1] +mx=max(abs(i) for i in shape) + +for row in shape: + if row>0: + line=char * row + else: + line=(" "* -row) + char + ll=len(line) + if ll <= mx: + line += " " * (mx-ll+1) + f=line[1:] + f=f[::-1] + print(f+line) diff --git a/challenge-124/roger-bell-west/python/ch-2.py b/challenge-124/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..8867ab1a2d --- /dev/null +++ b/challenge-124/roger-bell-west/python/ch-2.py @@ -0,0 +1,31 @@ +#! /usr/bin/python3 + +from itertools import combinations + +def tow(n): + target=int(sum(n)/2) + k=int(len(n)/2) + bestval=-1 + bestset=[] + for set in combinations(n,k): + l=abs(target-sum(set)) + if bestval < 0 or l < bestval: + bestval=l + bestset=set + o=[[],[]] + r=dict() + for i in bestset: + r[i]=1 + for m in n: + if m in r: + o[1].append(m) + else: + o[0].append(m) + for i in range(2): + print("(" + ", ".join([str(j) for j in o[i]]) + ")") + + +tow([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) +print("") + +tow([10, -15, 20, 30, -25, 0, 5, 40, -5]) diff --git a/challenge-124/roger-bell-west/raku/ch-1.p6 b/challenge-124/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..462ebb6407 --- /dev/null +++ b/challenge-124/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,20 @@ +#! /usr/bin/perl6 + +my $char='^'; +my @shape=(3,-3,-4,-5,-5,-5,-5,-5,-4,-3,3,1,1,1,3,1,1); +my $mx=max(map {abs($_)},@shape); + +for @shape -> $row { + my $line; + if ($row>0) { + $line=$char x $row; + } else { + $line=(' ' x -$row)~$char; + } + my $ll=chars($line); + if ($ll <= $mx) { + $line ~= ' ' x ($mx-$ll+1); + } + my $f=$line.substr(1).flip; + print "$f$line\n"; +} diff --git a/challenge-124/roger-bell-west/raku/ch-2.p6 b/challenge-124/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..8b899e6f45 --- /dev/null +++ b/challenge-124/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,32 @@ +#! /usr/bin/perl6 + +tow([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]); +say ""; + +tow([10, -15, 20, 30, -25, 0, 5, 40, -5]); + +sub tow(@n) { + my $target=floor(sum(@n)/2); + my $k=floor((@n.elems)/2); + my $bestval=-1; + my @bestset; + for combinations(@n,$k) -> @set { + my $l=abs($target-@set.sum()); + if ($bestval < 0 || $l < $bestval) { + $bestval=$l; + @bestset=@set.clone; + } + } + my @o=([],[]); + my %r=map {$_ => 1},@bestset; + for @n -> $m { + if (%r{$m}:exists) { + push @o[1],$m; + } else { + push @o[0],$m; + } + } + for (0,1) -> $i { + say "(" ~ @o[$i].join(', ') ~ ")"; + } +} diff --git a/challenge-124/roger-bell-west/ruby/ch-1.rb b/challenge-124/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..4aa67a36cd --- /dev/null +++ b/challenge-124/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,19 @@ +#! /usr/bin/ruby + +char="^" +shape=[3,-3,-4,-5,-5,-5,-5,-5,-4,-3,3,1,1,1,3,1,1] +mx=shape.map{|i|i.abs}.max + +shape.each do |row| + if row>0 then + line=char * row + else + line=(" " * -row) + char + end + ll=line.length + if ll <= mx then + line += " " * (mx-ll+1) + end + f=line[1..-1].reverse + print(f+line+"\n") +end diff --git a/challenge-124/roger-bell-west/ruby/ch-2.rb b/challenge-124/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..363e3b9b00 --- /dev/null +++ b/challenge-124/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,35 @@ +#! /usr/bin/ruby + +def tow(n) + target=(n.sum()/2).to_i + k=(n.length()/2).to_i + bestval=-1 + bestset=[] + n.combination(k).each do |set| + l=(target-set.sum()).abs() + if bestval < 0 || l < bestval then + bestval=l + bestset=set + end + end + o=[[],[]] + r=Hash.new + bestset.each do |i| + r[i]=1 + end + n.each do |m| + if r.has_key?(m) then + o[1].push(m) + else + o[0].push(m) + end + end + 0.upto(1) do |i| + print("(#{o[i].map{|j| j.to_s}.join(', ')})\n") + end +end + +tow([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) +print("\n") + +tow([10, -15, 20, 30, -25, 0, 5, 40, -5]) diff --git a/challenge-124/roger-bell-west/rust/ch-1.rs b/challenge-124/roger-bell-west/rust/ch-1.rs new file mode 100755 index 0000000000..3e922d7088 --- /dev/null +++ b/challenge-124/roger-bell-west/rust/ch-1.rs @@ -0,0 +1,22 @@ +#! /bin/sh +//usr/bin/env rustc $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +fn main() { + let chr="^"; + let shape: Vec<i8>=vec![3,-3,-4,-5,-5,-5,-5,-5,-4,-3,3,1,1,1,3,1,1]; + let mx: usize=shape.clone().into_iter().map(|i| i.abs()).max().unwrap() as usize; + for row in shape { + let mut line; + if row>0 { + line=(0..row).map(|_| chr).collect::<String>(); + } else { + line=(0..-row).map(|_| " ").collect::<String>() + chr; + } + let ll=line.len(); + if ll <= mx { + line += &(0..mx-ll+1).map(|_| " ").collect::<String>(); + } + let f: String=line[1..].chars().rev().collect(); + println!("{}{}",f,line); + } +} diff --git a/challenge-124/roger-bell-west/rust/ch-2.rs b/challenge-124/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..5b1b4248a6 --- /dev/null +++ b/challenge-124/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,37 @@ +use std::collections::HashSet; +use permutator::Combination; + +fn main() { + tow(vec![10, 20, 30, 40, 50, 60, 70, 80, 90, 100]); + println!(""); + tow(vec![10, -15, 20, 30, -25, 0, 5, 40, -5]); +} + +fn tow(n: Vec<i64>) { + let target: i64=n.iter().sum::<i64>()/2; + let k: usize=n.len()/2; + let mut bestval: i64=-1; + let mut bestset: Vec<i64>=vec![]; + n.combination(k).for_each(|set| { + let l: i64=(target-set.iter().map(|i| **i).sum::<i64>()).abs(); + if bestval < 0 || l < bestval { + bestval=l; + bestset=set.iter().map(|i| **i).collect(); + } + }); + let mut o=vec![vec![],vec![]]; + let mut r: HashSet<i64>=HashSet::new(); + for i in bestset { + r.insert(i); + } + for m in n { + if r.contains(&m) { + o[1].push(m); + } else { + o[0].push(m); + } + } + for i in 0..=1 { + println!("({})",o[i].iter().map(|j| j.to_string()).collect::<Vec<String>>().join(", ")); + } +} |
