aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2021-10-04 13:55:58 +0100
committerRoger Bell_West <roger@firedrake.org>2021-10-04 13:55:58 +0100
commitb52b70e0abecf04100c440e15bef2a7167fc4b08 (patch)
treede6ca8a6dbd0d10a38182df34d209df6b541f11b
parent20ffd7b7c80e195548325ace22fe92f2a499984c (diff)
downloadperlweeklychallenge-club-b52b70e0abecf04100c440e15bef2a7167fc4b08.tar.gz
perlweeklychallenge-club-b52b70e0abecf04100c440e15bef2a7167fc4b08.tar.bz2
perlweeklychallenge-club-b52b70e0abecf04100c440e15bef2a7167fc4b08.zip
Solutions for challenge #133
-rwxr-xr-xchallenge-133/roger-bell-west/perl/ch-1.pl24
-rwxr-xr-xchallenge-133/roger-bell-west/perl/ch-2.pl60
-rw-r--r--challenge-133/roger-bell-west/postscript/ch-1.ps22
-rw-r--r--challenge-133/roger-bell-west/postscript/ch-2.ps82
-rwxr-xr-xchallenge-133/roger-bell-west/python/ch-1.py29
-rwxr-xr-xchallenge-133/roger-bell-west/python/ch-2.py50
-rwxr-xr-xchallenge-133/roger-bell-west/raku/ch-1.p623
-rwxr-xr-xchallenge-133/roger-bell-west/raku/ch-2.p661
-rwxr-xr-xchallenge-133/roger-bell-west/ruby/ch-1.rb36
-rwxr-xr-xchallenge-133/roger-bell-west/ruby/ch-2.rb63
-rwxr-xr-xchallenge-133/roger-bell-west/rust/ch-1.rs35
-rwxr-xr-xchallenge-133/roger-bell-west/rust/ch-2.rs58
12 files changed, 543 insertions, 0 deletions
diff --git a/challenge-133/roger-bell-west/perl/ch-1.pl b/challenge-133/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..fae7ff77e4
--- /dev/null
+++ b/challenge-133/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+
+use strict;
+
+use Test::More tests => 4;
+
+is(isqrt(10),3,'example 1');
+is(isqrt(27),5,'example 1');
+is(isqrt(85),9,'example 1');
+is(isqrt(101),10,'example 1');
+
+sub isqrt {
+ my $n=shift;
+ my $k=$n>>1;
+ my $x=1;
+ while ($x) {
+ my $k1=($k+$n/$k) >> 1;
+ if ($k1 >= $k) {
+ $x=0;
+ }
+ $k=$k1;
+ }
+ return $k;
+}
diff --git a/challenge-133/roger-bell-west/perl/ch-2.pl b/challenge-133/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..9807971ee7
--- /dev/null
+++ b/challenge-133/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,60 @@
+#! /usr/bin/perl
+
+use strict;
+
+use Test::More tests => 1;
+
+is_deeply(smith(10),[4, 22, 27, 58, 85, 94, 121, 166, 202, 265,],'example 1');
+
+use integer;
+
+sub smith {
+ my $count=shift;
+ my @o;
+ my $c=1;
+ while (1) {
+ $c++;
+ my @ff=factor($c);
+ if (scalar @ff == 1) {
+ next;
+ }
+ if (sumofdigits($c)==sumofdigits(@ff)) {
+ push @o,$c;
+ $count--;
+ if ($count <= 0) {
+ last;
+ }
+ }
+ }
+ return \@o;
+}
+
+sub factor {
+ my $n=0+shift;
+ my @f;
+ my $ft=2;
+ while ($n > 1) {
+ if ($n % $ft == 0) {
+ push @f,$ft;
+ $n /= $ft;
+ } else {
+ $ft++;
+ if ($ft % 2 == 0) {
+ $ft++;
+ }
+ }
+ }
+ return @f;
+}
+
+sub sumofdigits {
+ my $s=0;
+ foreach my $k (@_) {
+ my $l=$k+0;
+ while ($l > 0) {
+ $s+=$l % 10;
+ $l /= 10;
+ }
+ }
+ return $s;
+}
diff --git a/challenge-133/roger-bell-west/postscript/ch-1.ps b/challenge-133/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..0640c20350
--- /dev/null
+++ b/challenge-133/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,22 @@
+%
+
+/isqrt {
+ /n exch def
+ /k n -1 bitshift def
+ /x false def
+ {
+ /k1 k n k idiv add -1 bitshift def
+ k1 k ge {
+ /x true def
+ } if
+ /k k1 def
+ x { exit } if
+ } loop
+ k
+} def
+
+(test isqrt) =
+10 isqrt 3 eq { (Pass) } { (Fail) } ifelse print ( ) print
+27 isqrt 5 eq { (Pass) } { (Fail) } ifelse print ( ) print
+85 isqrt 9 eq { (Pass) } { (Fail) } ifelse print ( ) print
+101 isqrt 10 eq { (Pass) } { (Fail) } ifelse =
diff --git a/challenge-133/roger-bell-west/postscript/ch-2.ps b/challenge-133/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..ac33b436b7
--- /dev/null
+++ b/challenge-133/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,82 @@
+%!PS
+
+/sumofdigits {
+ /sum 0 def
+ {
+ {
+ dup 0 eq { pop exit } if
+ dup 10 mod sum add /sum exch def
+ 10 idiv
+ } loop
+ } forall
+ sum
+} def
+
+(test sod) =
+[ 2 ] sumofdigits
+2 eq { (Pass) } { (Fail) } ifelse print ( ) print
+[ 11 ] sumofdigits
+2 eq { (Pass) } { (Fail) } ifelse print ( ) print
+[ 66 ] sumofdigits
+12 eq { (Pass) } { (Fail) } ifelse =
+
+/factor {
+ /ft 2 def
+ dup array /f exch def
+ /fi 0 def
+ {
+ dup ft mod 0 eq {
+ f fi ft put
+ /fi fi 1 add def
+ ft idiv
+ } {
+ /ft ft 1 add def
+ ft 2 mod 0 eq {
+ /ft ft 1 add def
+ } if
+ } ifelse
+ dup 1 le { pop exit } if
+ } loop
+ fi array /out exch def
+ 0 1 fi 1 sub {
+ /i exch def
+ out i f i get put
+ } for
+ out
+} def
+
+(test factor) =
+2 factor ==
+10 factor ==
+666 factor ==
+
+/smith {
+ /count exch def
+ /c 1 def
+ {
+ /c c 1 add def
+ /ff c factor def
+ ff length 1 ne {
+ ff sumofdigits [ c ] sumofdigits eq {
+ c
+ /count count 1 sub def
+ count 0 le {
+ exit
+ } if
+ } if
+ } if
+ } loop
+} def
+
+(test 1) =
+10 smith
+265 eq { (Pass) } { (Fail) } ifelse print ( ) print
+202 eq { (Pass) } { (Fail) } ifelse print ( ) print
+166 eq { (Pass) } { (Fail) } ifelse print ( ) print
+121 eq { (Pass) } { (Fail) } ifelse print ( ) print
+94 eq { (Pass) } { (Fail) } ifelse print ( ) print
+85 eq { (Pass) } { (Fail) } ifelse print ( ) print
+58 eq { (Pass) } { (Fail) } ifelse print ( ) print
+27 eq { (Pass) } { (Fail) } ifelse print ( ) print
+22 eq { (Pass) } { (Fail) } ifelse print ( ) print
+4 eq { (Pass) } { (Fail) } ifelse =
diff --git a/challenge-133/roger-bell-west/python/ch-1.py b/challenge-133/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..64a90692de
--- /dev/null
+++ b/challenge-133/roger-bell-west/python/ch-1.py
@@ -0,0 +1,29 @@
+#! /usr/bin/python3
+
+import unittest
+
+def isqrt(n):
+ k=n >> 1
+ x=True
+ while x:
+ k1=(k+int(n/k)) >> 1
+ if k1 >= k:
+ x=0
+ k=k1
+ return k
+
+class TestIsqrt(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(isqrt(10),3,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(isqrt(27),5,'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(isqrt(85),9,'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(isqrt(101),10,'example 4')
+
+unittest.main()
diff --git a/challenge-133/roger-bell-west/python/ch-2.py b/challenge-133/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..85ffab558c
--- /dev/null
+++ b/challenge-133/roger-bell-west/python/ch-2.py
@@ -0,0 +1,50 @@
+#! /usr/bin/python3
+
+import unittest
+
+def sumofdigits(kk):
+ s=int(0)
+ for k in kk:
+ l=int(k)
+ while (l>0):
+ s+=l % 10
+ l = int(l/10)
+ return s
+
+def factor(nn):
+ f=[]
+ ft=2
+ n=nn
+ while n>1:
+ dm=divmod(n,ft)
+ if dm[1] == 0:
+ f.append(ft)
+ n = dm[0]
+ else:
+ ft += 1
+ if ft % 2 == 0:
+ ft += 1
+ return f
+
+def smith(ccount):
+ lcount=ccount
+ o=[]
+ c=1
+ while (1):
+ c += 1
+ ff=factor(c)
+ if len(ff)==1:
+ continue
+ if sumofdigits([c])==sumofdigits(ff):
+ o.append(c)
+ lcount -= 1
+ if lcount<=0:
+ break
+ return o
+
+class TestSmith(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(smith(10),[4, 22, 27, 58, 85, 94, 121, 166, 202, 265],'example 1')
+
+unittest.main()
diff --git a/challenge-133/roger-bell-west/raku/ch-1.p6 b/challenge-133/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..dc2674ba08
--- /dev/null
+++ b/challenge-133/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 4;
+
+is(isqrt(10),3,'example 1');
+is(isqrt(27),5,'example 1');
+is(isqrt(85),9,'example 1');
+is(isqrt(101),10,'example 1');
+
+sub isqrt($n) {
+ my $k=$n +> 1;
+ my $x=1;
+ while ($x) {
+ my $k1=($k+$n/$k) +> 1;
+ if ($k1 >= $k) {
+ $x=0;
+ }
+ $k=$k1;
+ }
+ return $k;
+}
diff --git a/challenge-133/roger-bell-west/raku/ch-2.p6 b/challenge-133/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..08728f03db
--- /dev/null
+++ b/challenge-133/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,61 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 1;
+
+is-deeply(smith(10),
+ [4, 22, 27, 58, 85, 94, 121, 166, 202, 265,],
+ 'example 1'
+ );
+
+sub smith($ccount) {
+ my $count=$ccount;
+ my @o;
+ my $c=1;
+ while (1) {
+ $c++;
+ my @ff=factor($c);
+ if (@ff.elems == 1) {
+ next;
+ }
+ if (sumofdigits(($c,))==sumofdigits(@ff)) {
+ push @o,$c;
+ $count--;
+ if ($count <= 0) {
+ last;
+ }
+ }
+ }
+ return @o;
+}
+
+sub factor($nn) {
+ my $n=$nn;
+ my @f;
+ my $ft=2;
+ while ($n > 1) {
+ if ($n % $ft == 0) {
+ push @f,$ft;
+ $n /= $ft;
+ } else {
+ $ft++;
+ if ($ft % 2 == 0) {
+ $ft++;
+ }
+ }
+ }
+ return @f;
+}
+
+sub sumofdigits(@l) {
+ my $s=0;
+ for @l -> $k {
+ my $l=$k+0;
+ while ($l > 0) {
+ $s+=$l % 10;
+ $l=floor($l/10);
+ }
+ }
+ return $s;
+}
diff --git a/challenge-133/roger-bell-west/ruby/ch-1.rb b/challenge-133/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..3c780d5c5c
--- /dev/null
+++ b/challenge-133/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,36 @@
+#! /usr/bin/ruby
+
+def isqrt(n)
+ k = n >> 1
+ x = true
+ while x do
+ k1=(k+(n/k).to_int) >> 1
+ if k1 >= k then
+ x=false
+ end
+ k=k1
+ end
+ return k
+end
+
+require 'test/unit'
+
+class TestIsqrt < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(3,isqrt(10))
+ end
+
+ def test_ex2
+ assert_equal(5,isqrt(27))
+ end
+
+ def test_ex3
+ assert_equal(9,isqrt(85))
+ end
+
+ def test_ex4
+ assert_equal(10,isqrt(101))
+ end
+
+end
diff --git a/challenge-133/roger-bell-west/ruby/ch-2.rb b/challenge-133/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..271ffad94b
--- /dev/null
+++ b/challenge-133/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,63 @@
+#! /usr/bin/ruby
+
+def sumofdigits(kk)
+ s=0
+ kk.each do |k|
+ l=k
+ while l>0 do
+ s+=l % 10
+ l=(l/10).to_int
+ end
+ end
+ return s
+end
+
+def factor(nn)
+ n=nn
+ f=[]
+ ft=2
+ while n>1 do
+ dm=n.divmod(ft)
+ if dm[1] == 0 then
+ f.push(ft)
+ n = dm[0]
+ else
+ ft += 1
+ if ft % 2 == 0 then
+ ft += 1
+ end
+ end
+ end
+ return f
+end
+
+def smith(ccount)
+ count=ccount
+ o=[]
+ c=1
+ while 1 do
+ c += 1
+ ff=factor(c)
+ if ff.length==1 then
+ next
+ end
+ if sumofdigits([c]) == sumofdigits(ff) then
+ o.push(c)
+ count -= 1
+ if count <= 0 then
+ break
+ end
+ end
+ end
+ return o
+end
+
+require 'test/unit'
+
+class TestSmith < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal([4, 22, 27, 58, 85, 94, 121, 166, 202, 265],smith(10))
+ end
+
+end
diff --git a/challenge-133/roger-bell-west/rust/ch-1.rs b/challenge-133/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..b3ba6a9e6b
--- /dev/null
+++ b/challenge-133/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,35 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(isqrt(10),3);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(isqrt(27),5);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(isqrt(85),9);
+}
+
+#[test]
+fn test_ex4() {
+ assert_eq!(isqrt(101),10);
+}
+
+fn isqrt(n: u32) -> u32 {
+ let mut k=n >> 1;
+ let mut x=true;
+ while x {
+ let k1=(k+n/k) >> 1;
+ if k1 >= k {
+ x=false;
+ }
+ k=k1;
+ }
+ k
+}
diff --git a/challenge-133/roger-bell-west/rust/ch-2.rs b/challenge-133/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..fa65654aa7
--- /dev/null
+++ b/challenge-133/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,58 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(smith(10),vec![4, 22, 27, 58, 85, 94, 121, 166, 202, 265]);
+}
+
+fn smith(ccount: u32) -> Vec<u32> {
+ let mut count=ccount;
+ let mut o=vec![];
+ let mut c=1;
+ loop {
+ c+= 1;
+ let ff=factor(c);
+ if ff.len()==1 {
+ continue;
+ }
+ if sumofdigits(vec![c]) == sumofdigits(ff) {
+ o.push(c);
+ count-= 1;
+ if count<=0 {
+ break;
+ }
+ }
+ }
+ o
+}
+
+fn factor (nn: u32) -> Vec<u32> {
+ let mut n=nn;
+ let mut f=vec![];
+ let mut ft=2;
+ while n>1 {
+ if n % ft == 0 {
+ f.push(ft);
+ n /= ft;
+ } else {
+ ft+= 1;
+ if ft%2 == 0 {
+ ft+= 1;
+ }
+ }
+ }
+ f
+}
+
+fn sumofdigits(kk: Vec<u32>) -> u32 {
+ let mut s=0;
+ for k in kk {
+ let mut l=k;
+ while l>0 {
+ s+=l % 10;
+ l /= 10;
+ }
+ }
+ s
+}