aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-08-04 10:49:47 +0100
committerGitHub <noreply@github.com>2021-08-04 10:49:47 +0100
commitf6fa95c6519eb9085ced53d41af473d13f7242c6 (patch)
treee8ee5a4c994fc78d0d2e3fa4390933cff19b0798
parent255eb8afa4cbf142cd9eabc953733cd6b23e04c7 (diff)
parent05acfcc1bac0582eddfc7e74b1c41c5ee007838e (diff)
downloadperlweeklychallenge-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-xchallenge-124/roger-bell-west/perl/ch-1.pl26
-rwxr-xr-xchallenge-124/roger-bell-west/perl/ch-2.pl39
-rw-r--r--challenge-124/roger-bell-west/postscript/ch-1.ps20
-rwxr-xr-xchallenge-124/roger-bell-west/python/ch-1.py17
-rwxr-xr-xchallenge-124/roger-bell-west/python/ch-2.py31
-rwxr-xr-xchallenge-124/roger-bell-west/raku/ch-1.p620
-rwxr-xr-xchallenge-124/roger-bell-west/raku/ch-2.p632
-rwxr-xr-xchallenge-124/roger-bell-west/ruby/ch-1.rb19
-rwxr-xr-xchallenge-124/roger-bell-west/ruby/ch-2.rb35
-rwxr-xr-xchallenge-124/roger-bell-west/rust/ch-1.rs22
-rwxr-xr-xchallenge-124/roger-bell-west/rust/ch-2.rs37
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(", "));
+ }
+}