aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-10-11 22:06:26 +0100
committerGitHub <noreply@github.com>2021-10-11 22:06:26 +0100
commit6830e20751b898495106beb7c66563b31c6ad627 (patch)
treed7209565e2980dec7e46cb58f119a7e831db08c4
parent534aa94979aadd09ff2f214e81ee10fe48747fb2 (diff)
parent29e01983fc0c62b4cba73712beb9e435d1650f42 (diff)
downloadperlweeklychallenge-club-6830e20751b898495106beb7c66563b31c6ad627.tar.gz
perlweeklychallenge-club-6830e20751b898495106beb7c66563b31c6ad627.tar.bz2
perlweeklychallenge-club-6830e20751b898495106beb7c66563b31c6ad627.zip
Merge pull request #5011 from Firedrake/rogerbw-challenge-134
Solutions for challenge #134
-rwxr-xr-xchallenge-134/roger-bell-west/perl/ch-1.pl35
-rwxr-xr-xchallenge-134/roger-bell-west/perl/ch-2.pl56
-rw-r--r--challenge-134/roger-bell-west/postscript/ch-2.ps96
-rwxr-xr-xchallenge-134/roger-bell-west/python/ch-1.py33
-rwxr-xr-xchallenge-134/roger-bell-west/raku/ch-1.p630
-rwxr-xr-xchallenge-134/roger-bell-west/raku/ch-2.p649
-rwxr-xr-xchallenge-134/roger-bell-west/ruby/ch-1.rb37
-rwxr-xr-xchallenge-134/roger-bell-west/rust/ch-1.rs35
8 files changed, 371 insertions, 0 deletions
diff --git a/challenge-134/roger-bell-west/perl/ch-1.pl b/challenge-134/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..c085cd1060
--- /dev/null
+++ b/challenge-134/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,35 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+is_deeply(pandigital(10),[1023456789, 1023456798, 1023456879, 1023456897, 1023456978, 1023456987, 1023457689, 1023457698, 1023457869, 1023457896],'example 1');
+
+use Algorithm::Permute;
+
+sub pandigital {
+ my $count=shift;
+ my $digits=1;
+ my $cc=1;
+ while ($cc<$count) {
+ $digits++;
+ $cc*=$digits;
+ if ($digits > 10) {
+ die "too large\n";
+ }
+ }
+ my @template=(reverse (1,0,2..9));
+ my @o;
+ my @lead=reverse splice @template,$digits;
+ my $p=Algorithm::Permute->new(\@template);
+ while (my @r=$p->next) {
+ push @o,join('',@r);
+ }
+ @o=sort @o;
+ splice @o,$count;
+ my $l=join('',@lead);
+ @o=map {"$l$_"} @o;
+ return \@o;
+}
diff --git a/challenge-134/roger-bell-west/perl/ch-2.pl b/challenge-134/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..efb7c8bbe0
--- /dev/null
+++ b/challenge-134/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,56 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+distinctterms(3,3);
+
+distinctterms(3,5);
+
+use List::Util qw(max sum);
+
+sub distinctterms {
+ my $m=shift;
+ my $n=shift;
+ my @r;
+ push @r,['x',(1..$n)];
+ my %terms;
+ foreach my $mm (1..$m) {
+ my @q=($mm);
+ foreach my $nn (1..$n) {
+ my $p=$mm*$nn;
+ push @q,$p;
+ $terms{$p}=1;
+ }
+ push @r,\@q;
+ }
+ my @cw=(0,0);
+ foreach my $rr (@r) {
+ foreach my $ci (0..$#{$rr}) {
+ my $wi=$ci==0?0:1;
+ $cw[$wi]=max($cw[$wi],length($rr->[$ci]));
+ }
+ }
+ foreach my $ri (0..$#r) {
+ my @k;
+ if ($ri==0) {
+ push @k,sprintf('%'.$cw[0].'s',$r[$ri][0]);
+ } else {
+ push @k,sprintf('%'.$cw[0].'d',$r[$ri][0]);
+ }
+ push @k,'|';
+ foreach my $ci (1..$#{$r[$ri]}) {
+ push @k,sprintf('%'.$cw[1].'d',$r[$ri][$ci]);
+ }
+ my $l=join(' ',@k);
+ print "$l\n";
+ if ($ri==0) {
+ $l =~ s/[^|]/-/g;
+ $l =~ s/\|/+/g;
+ print "$l\n";
+ }
+ }
+ print "\n";
+ print "Distinct Terms: ".join(', ',sort {$a <=> $b} keys %terms)."\n";
+ print "Count: ".(scalar keys %terms)."\n";
+}
diff --git a/challenge-134/roger-bell-west/postscript/ch-2.ps b/challenge-134/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..5cd1cb56e6
--- /dev/null
+++ b/challenge-134/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,96 @@
+%!PS
+
+/bubblesort {
+ mark exch aload pop counttomark /idx
+ exch store
+ {
+ 0 1 idx 1 sub {
+ pop 2 copy gt {
+ exch
+ } if idx 1 roll
+ } for
+ idx 1 roll /idx idx 1 sub store
+ idx 0 eq {
+ exit
+ } if
+ } loop
+]
+} store
+
+/strconcat % (a) (b) -> (ab)
+{ exch dup length
+ 2 index length add string
+ dup dup 4 2 roll copy length
+ 4 -1 roll putinterval
+} bind def
+
+/strjoin % [(a) (b) (c)] (j) -> ajbjc
+{
+ /j exch def
+ dup 0 get /out exch def
+ /first true def
+ {
+ first {
+ /first false def
+ } {
+ out j strconcat
+ exch strconcat
+ /out exch def
+ } ifelse
+ } forall
+ out
+} def
+
+ /apush { % [a b] c -> [a b c]
+ /t exch def
+ [ exch aload pop t ]
+ } def
+
+ /multable {
+ /x exch def
+ /y exch def
+ /dscale 25 def
+ gsave 20 800 translate
+ /Times-Roman findfont 12 scalefont setfont
+ x y mul dict /results exch def
+ 0 0 6 sub moveto (x) show
+ 0
+ 1 1 y {
+ /yy exch def
+ 0 yy dscale neg mul 6 sub moveto yy (...) cvs show
+ } for
+ 1 1 x {
+ /xx exch def
+ xx dscale mul 0 6 sub moveto xx (...) cvs show
+ 1 1 y {
+ /yy exch def
+ /res xx yy mul def
+ results res 1 put
+ xx dscale mul yy dscale neg mul 6 sub moveto res (...) cvs show
+ } for
+ } for
+ 0 0.5 dscale mul neg moveto
+ x 0.5 add dscale mul 0.5 dscale mul neg lineto
+ 0.5 dscale mul 0 moveto
+ 0.5 dscale mul y 0.5 add dscale mul neg lineto
+ stroke
+ /ra 0 array def
+ results {
+ pop
+ ra exch apush /ra exch def
+ } forall
+ ra bubblesort
+ /rb 0 array def
+ {
+ (..) cvs rb exch dup length string cvs apush /rb exch store
+ } forall
+ rb (, ) strjoin
+ 0 y 2 add dscale mul neg moveto
+ show
+ 0 y 3 add dscale mul neg moveto
+ ra length (..) cvs show
+ grestore
+ showpage
+ } def
+ 3 3 multable
+ 3 5 multable
diff --git a/challenge-134/roger-bell-west/python/ch-1.py b/challenge-134/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..df16a2ea21
--- /dev/null
+++ b/challenge-134/roger-bell-west/python/ch-1.py
@@ -0,0 +1,33 @@
+#! /usr/bin/python3
+
+import unittest
+
+from itertools import permutations
+
+def pandigital(count):
+ digits=1
+ cc=1
+ while cc<count:
+ digits += 1
+ cc *= digits
+ if digits > 10:
+ print("too large")
+ return []
+ template=[*range(9,1,-1),0,1]
+ lead=template[digits:]
+ lead.reverse()
+ l="".join(str(i) for i in lead)
+ template=template[0:digits]
+ o=[]
+ for p in permutations(template):
+ o.append("".join(str(i) for i in p))
+ o.sort()
+ o=o[0:count]
+ return [int(l+i) for i in o]
+
+class TestIsqrt(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(pandigital(10),[1023456789, 1023456798, 1023456879, 1023456897, 1023456978, 1023456987, 1023457689, 1023457698, 1023457869, 1023457896],'example 1')
+
+unittest.main()
diff --git a/challenge-134/roger-bell-west/raku/ch-1.p6 b/challenge-134/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..99918b31ab
--- /dev/null
+++ b/challenge-134/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,30 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 1;
+
+is-deeply(pandigital(10),[1023456789, 1023456798, 1023456879, 1023456897, 1023456978, 1023456987, 1023457689, 1023457698, 1023457869, 1023457896],'example 1');
+
+sub pandigital($count) {
+ my $digits=1;
+ my $cc=1;
+ while ($cc < $count) {
+ $digits++;
+ $cc*=$digits;
+ if ($digits > 10) {
+ die "too large\n";
+ }
+ }
+ my @template=reverse (1,0,2,3,4,5,6,7,8,9);
+ my @o;
+ my @lead=reverse splice @template,$digits;
+ for @template.permutations -> @r {
+ push @o,join('',@r);
+ }
+ @o=sort @o;
+ splice @o,$count;
+ my $l=join('',@lead);
+ @o=map {"$l$_"+0},@o;
+ return @o;
+}
diff --git a/challenge-134/roger-bell-west/raku/ch-2.p6 b/challenge-134/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..945ffd929d
--- /dev/null
+++ b/challenge-134/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,49 @@
+#! /usr/bin/perl6
+
+distinctterms(3,3);
+
+distinctterms(3,5);
+
+sub distinctterms($m,$n) {
+ my @r;
+ push @r,[('x',1..$n).flat];
+ my %terms;
+ for (1..$m) -> $mm {
+ my @q=($mm);
+ for (1..$n) -> $nn {
+ my $p=$mm*$nn;
+ push @q,$p;
+ %terms{$p}=1;
+ }
+ push @r,@q;
+ }
+ my @cw=(0,0);
+ for @r -> @rr {
+ for (0..@rr.end) -> $ci {
+ my $wi=$ci==0 ?? 0 !! 1;
+ @cw[$wi]=max(@cw[$wi],chars(@rr[$ci]));
+ }
+ }
+ for (0..@r.end) -> $ri {
+ my @k;
+ if ($ri==0) {
+ push @k,sprintf('%' ~ @cw[0] ~ 's',@r[$ri][0]);
+ } else {
+ push @k,sprintf('%' ~ @cw[0] ~ 'd',@r[$ri][0]);
+ }
+ push @k,'|';
+ for (1..@r[$ri].end) -> $ci {
+ push @k,sprintf('%' ~ @cw[1] ~ 'd',@r[$ri][$ci]);
+ }
+ my $l=join(' ',@k);
+ say $l;
+ if ($ri==0) {
+ $l ~~ s:g/<-[|]>/-/;
+ $l ~~ s:g/\|/+/;
+ say $l;
+ }
+ }
+ say "";
+ say "Distinct Terms: " ~ join(', ',sort { $^a <=> $^b },keys %terms);
+ say "Count: " ~ (%terms.keys.elems);
+}
diff --git a/challenge-134/roger-bell-west/ruby/ch-1.rb b/challenge-134/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..9cf573469d
--- /dev/null
+++ b/challenge-134/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,37 @@
+#! /usr/bin/ruby
+
+def pandigital(count)
+ digits=1
+ cc=1
+ while cc<count do
+ digits += 1
+ cc *= digits
+ if digits > 10 then
+ return []
+ end
+ end
+ template=(2..9).to_a
+ template.unshift(0)
+ template.unshift(1)
+ template.reverse!
+ lead=template[digits..-1].reverse
+ template=template[0..digits-1]
+ o=[]
+ template.permutation do |r|
+ o.push(r.join)
+ end
+ o.sort!
+ o=o[0..count-1]
+ l=lead.join
+ return o.map{|j| (l+j).to_i}
+end
+
+require 'test/unit'
+
+class TestIsqrt < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal([1023456789, 1023456798, 1023456879, 1023456897, 1023456978, 1023456987, 1023457689, 1023457698, 1023457869, 1023457896],pandigital(10))
+ end
+
+end
diff --git a/challenge-134/roger-bell-west/rust/ch-1.rs b/challenge-134/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..d549b846d8
--- /dev/null
+++ b/challenge-134/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,35 @@
+use permutator::Permutation;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(pandigital(10),vec![1023456789, 1023456798, 1023456879, 1023456897, 1023456978, 1023456987, 1023457689, 1023457698, 1023457869, 1023457896]);
+}
+
+fn pandigital(count: u32) -> Vec<u32> {
+ let mut digits=1;
+ let mut cc=1;
+ while cc < count {
+ digits+=1;
+ cc *= digits;
+ if digits > 10 {
+ println!("too large");
+ return vec![];
+ }
+ }
+ let mut template=(2..=9).collect::<Vec<u32>>();
+ template.reverse();
+ template.push(0);
+ template.push(1);
+ let mut lead=vec![0;10-digits as usize];
+ lead.clone_from_slice(&template[(digits as usize)..]);
+ lead.reverse();
+ let l=lead.into_iter().map(|i| i.to_string()).collect::<Vec<String>>().join("");
+ template.resize(digits as usize,0);
+ let mut o=vec![];
+ template.permutation().for_each(|p| {
+ o.push((&p).into_iter().map(|i| i.to_string()).collect::<Vec<String>>().join(""));
+ });
+ o.sort();
+ o.resize(count as usize,"".to_string());
+ o.into_iter().map(|i| (l.clone()+&i).parse().unwrap()).collect::<Vec<u32>>()
+}