diff options
| author | Roger Bell_West <roger@firedrake.org> | 2021-10-11 16:33:23 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2021-10-11 16:33:23 +0100 |
| commit | 29e01983fc0c62b4cba73712beb9e435d1650f42 (patch) | |
| tree | acab708a1f395513d61a0c1e579de5c38440813f | |
| parent | 5f01f0a38aa1e5a76c4262de8c7c6e1977c594ea (diff) | |
| download | perlweeklychallenge-club-29e01983fc0c62b4cba73712beb9e435d1650f42.tar.gz perlweeklychallenge-club-29e01983fc0c62b4cba73712beb9e435d1650f42.tar.bz2 perlweeklychallenge-club-29e01983fc0c62b4cba73712beb9e435d1650f42.zip | |
Solutions for challenge #134
| -rwxr-xr-x | challenge-134/roger-bell-west/perl/ch-1.pl | 35 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/perl/ch-2.pl | 56 | ||||
| -rw-r--r-- | challenge-134/roger-bell-west/postscript/ch-2.ps | 96 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/python/ch-1.py | 33 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/raku/ch-1.p6 | 30 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/raku/ch-2.p6 | 49 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/ruby/ch-1.rb | 37 | ||||
| -rwxr-xr-x | challenge-134/roger-bell-west/rust/ch-1.rs | 35 |
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>>() +} |
