aboutsummaryrefslogtreecommitdiff
path: root/challenge-167
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-05-31 17:27:53 +0100
committerGitHub <noreply@github.com>2022-05-31 17:27:53 +0100
commitab928b0f4cba2bf97c2fa0b0e229bf9df89b531e (patch)
tree632bc688adba5d957d9e08379cec0c405c2b9466 /challenge-167
parent95b68ec3530b952a89d3317f05b7da7cb6fd4145 (diff)
parent621bacf0507f72ff7fa268f616fd687dd7611159 (diff)
downloadperlweeklychallenge-club-ab928b0f4cba2bf97c2fa0b0e229bf9df89b531e.tar.gz
perlweeklychallenge-club-ab928b0f4cba2bf97c2fa0b0e229bf9df89b531e.tar.bz2
perlweeklychallenge-club-ab928b0f4cba2bf97c2fa0b0e229bf9df89b531e.zip
Merge pull request #6182 from Firedrake/rogerbw-challenge-167
Solutions for challenge #167
Diffstat (limited to 'challenge-167')
-rwxr-xr-xchallenge-167/roger-bell-west/javascript/ch-1.js117
-rw-r--r--challenge-167/roger-bell-west/kotlin/ch-1.kt95
-rwxr-xr-xchallenge-167/roger-bell-west/lua/ch-1.lua141
-rwxr-xr-xchallenge-167/roger-bell-west/perl/ch-1.pl96
-rwxr-xr-xchallenge-167/roger-bell-west/perl/ch-2.pl50
-rw-r--r--challenge-167/roger-bell-west/postscript/ch-1.ps281
-rwxr-xr-xchallenge-167/roger-bell-west/python/ch-1.py73
-rwxr-xr-xchallenge-167/roger-bell-west/python/ch-2.py49
-rwxr-xr-xchallenge-167/roger-bell-west/raku/ch-1.p691
-rwxr-xr-xchallenge-167/roger-bell-west/raku/ch-2.p650
-rwxr-xr-xchallenge-167/roger-bell-west/ruby/ch-1.rb71
-rwxr-xr-xchallenge-167/roger-bell-west/ruby/ch-2.rb63
-rwxr-xr-xchallenge-167/roger-bell-west/rust/ch-1.rs93
-rw-r--r--challenge-167/roger-bell-west/rust/ch-2.rs55
14 files changed, 1325 insertions, 0 deletions
diff --git a/challenge-167/roger-bell-west/javascript/ch-1.js b/challenge-167/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..90c70da995
--- /dev/null
+++ b/challenge-167/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,117 @@
+#! /usr/bin/node
+function deepEqual(a,b)
+{
+ if( (typeof a == 'object' && a != null) &&
+ (typeof b == 'object' && b != null) )
+ {
+ var count = [0,0]
+ for( var key in a) count[0]++
+ for( var key in b) count[1]++
+ if( count[0]-count[1] != 0) {return false}
+ for( var key in a)
+ {
+ if(!(key in b) || !deepEqual(a[key],b[key])) {return false}
+ }
+ for( var key in b)
+ {
+ if(!(key in a) || !deepEqual(b[key],a[key])) {return false}
+ }
+ return true
+ }
+ else
+ {
+ return a === b
+ }
+}
+
+function genprimes(mx) {
+ let primesh=new Set([2,3])
+ for (let i = 6; i <= mx; i += 6) {
+ for (let j = i-1; j <= i+1; j += 2) {
+ if (j <= mx) {
+ primesh.add(j);
+ }
+ }
+ }
+ let q=[2,3,5,7];
+ let p=q.shift();
+ let mr=Math.floor(Math.sqrt(mx));
+ while (p <= mr) {
+ if (primesh.has(p)) {
+ let i=p*p
+ for (let i=p*p; i <= mx; i += p) {
+ primesh.delete(i);
+ }
+ }
+ if (q.length < 2) {
+ q.push(q[q.length-1]+4);
+ q.push(q[q.length-1]+2);
+ }
+ p=q.shift();
+ }
+ let primes=[...primesh];
+ primes.sort(function(a,b) {
+ return a-b;
+ });
+ return primes;
+}
+
+function cyclicpermute(n) {
+ let ss = n.toString();
+ let o = [];
+ for (let p = 0; p < ss.length; p++) {
+ ss = ss.slice(1,ss.length) + ss.slice(0,1)
+ o.push(parseInt(ss));
+ }
+ return o;
+}
+
+function circular(mindigits,ct) {
+ let o = [];
+ let base = 1;
+ for (let p = 2; p <= mindigits; p++) {
+ base *= 10;
+ }
+ while (o.length < ct) {
+ let pr = genprimes(base * 10);
+ let prs = new Set(pr);
+ for (let cp of pr) {
+ if (cp >= base) {
+ let v = true;
+ let cpp = cyclicpermute(cp);
+ for (let cpc of cpp) {
+ if (!prs.has(cpc)) {
+ v = false;
+ break;
+ }
+ }
+ if (v) {
+ o.push(cp);
+ if (o.size >= ct) {
+ break;
+ }
+ for (let cpc of cpp) {
+ prs.delete(cpc);
+ }
+ }
+ }
+ }
+ base *= 10;
+ }
+ return o;
+}
+
+if (deepEqual(cyclicpermute(123),[231, 312, 123])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (deepEqual(circular(3,10),[113, 197, 199, 337, 1193, 3779, 11939,
+ 19937, 193939, 199933])) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-167/roger-bell-west/kotlin/ch-1.kt b/challenge-167/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..f598869bb6
--- /dev/null
+++ b/challenge-167/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,95 @@
+import kotlin.math.*
+
+fun genprimes(mx: Int): ArrayList<Int> {
+ var primesh=mutableSetOf<Int>()
+ for (i in 2..3) {
+ primesh.add(i)
+ }
+ for (i in 6..mx+1 step 6) {
+ for (j in i-1..i+1 step 2) {
+ if (j <= mx) {
+ primesh.add(j)
+ }
+ }
+ }
+ var q=ArrayDeque(listOf(2,3,5,7))
+ var p=q.removeFirst()
+ val mr=sqrt(mx.toDouble()).toInt()
+ while (p <= mr) {
+ if (primesh.contains(p)) {
+ for (i in p*p..mx step p) {
+ primesh.remove(i)
+ }
+ }
+ if (q.size < 2) {
+ q.add(q.last()+4)
+ q.add(q.last()+2)
+ }
+ p=q.removeFirst()
+ }
+ var primes=ArrayList(primesh.distinct())
+ primes.sort()
+ return primes
+}
+
+fun cyclicpermute(n: Int): ArrayList<Int> {
+ var ss = n.toString()
+ var o = ArrayList<Int>()
+ for (p in 1..ss.length) {
+ ss = ss.slice(1..ss.length-1) + ss.slice(0..0)
+ o.add(ss.toInt())
+ }
+ return o
+}
+
+fun circular(mindigits: Int, ct: Int): ArrayList<Int> {
+ var o = ArrayList<Int>()
+ var base = 1
+ for (p in 2..mindigits) {
+ base *= 10
+ }
+ while (o.size < ct) {
+ val pr = genprimes(base * 10)
+ var prs = pr.toMutableSet()
+ for (cp in pr) {
+ if (cp >= base) {
+ var v = true
+ val cpp = cyclicpermute(cp)
+ for (cpc in cpp) {
+ if (!prs.contains(cpc)) {
+ v = false
+ break
+ }
+ }
+ if (v) {
+ o.add(cp)
+ if (o.size >= ct) {
+ break
+ }
+ for (cpc in cpp) {
+ prs.remove(cpc)
+ }
+ }
+ }
+ }
+ base *= 10
+ }
+ return o
+}
+
+fun main() {
+ if (cyclicpermute(123) == listOf(231, 312, 123)) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+
+ if (circular(3,10) == listOf(113, 197, 199, 337, 1193, 3779,
+ 11939, 19937, 193939, 199933)) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-167/roger-bell-west/lua/ch-1.lua b/challenge-167/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..f7ff8a8b1e
--- /dev/null
+++ b/challenge-167/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,141 @@
+#! /usr/bin/lua
+
+function dump(o)
+ if type(o) == 'table' then
+ local s = '{ '
+ for k,v in pairs(o) do
+ if type(k) ~= 'number' then k = '"'..k..'"' end
+ s = s .. '['..k..'] = ' .. dump(v) .. ','
+ end
+ return s .. '} '
+ else
+ return tostring(o)
+ end
+end
+
+-- by Michael Anderson at
+-- https://stackoverflow.com/questions/8722620/comparing-two-index-tables-by-index-value-in-lua
+function recursive_compare(t1,t2)
+ -- Use usual comparison first.
+ if t1==t2 then return true end
+ -- We only support non-default behavior for tables
+ if (type(t1)~="table") then return false end
+ -- They better have the same metatables
+ local mt1 = getmetatable(t1)
+ local mt2 = getmetatable(t2)
+ if( not recursive_compare(mt1,mt2) ) then return false end
+
+ -- Check each key-value pair
+ -- We have to do this both ways in case we miss some.
+ -- TODO: Could probably be smarter and not check those we've
+ -- already checked though!
+ for k1,v1 in pairs(t1) do
+ local v2 = t2[k1]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+ for k2,v2 in pairs(t2) do
+ local v1 = t1[k2]
+ if( not recursive_compare(v1,v2) ) then return false end
+ end
+
+ return true
+end
+
+function genprimes(mx)
+ local primesh = {}
+ for i = 2, 3 do
+ primesh[i] = true
+ end
+ for i = 6, mx, 6 do
+ for j = i-1, i+1, 2 do
+ if j <= mx then
+ primesh[j]=true
+ end
+ end
+ end
+ local q={2,3,5,7}
+ local p=table.remove(q,1)
+ local mr=math.floor(math.sqrt(mx))
+ while p <= mr do
+ if primesh[p] ~= nil then
+ for i = p*p,mx,p do
+ primesh[i] = nil
+ end
+ end
+ if #q < 2 then
+ table.insert(q,q[#q]+4)
+ table.insert(q,q[#q]+2)
+ end
+ p=table.remove(q,1)
+ end
+ local primes = {}
+ for k,v in pairs(primesh) do
+ table.insert(primes,k)
+ end
+ table.sort(primes)
+ return primes
+end
+
+function cyclicpermute(n)
+ local ss = n
+ local o = {}
+ for p = 1,string.len(ss) do
+ ss = string.sub(ss,2) .. string.sub(ss,1,1)
+ table.insert(o,ss+0)
+ end
+ return o
+end
+
+function circular(mindigits,ct)
+ local o = {}
+ local base = 1
+ for p = 2,mindigits do
+ base = base * 10
+ end
+ while #o < ct do
+ local pr = genprimes(base * 10)
+ local prs = {}
+ for k,q in pairs(pr) do
+ prs[q] = true
+ end
+ for k,cp in pairs(pr) do
+ if cp >= base then
+ local v = true
+ local cpp = cyclicpermute(cp)
+ for k2,cpc in pairs(cpp) do
+ if prs[cpc] == nil then
+ v = false
+ break
+ end
+ end
+ if v then
+ table.insert(o,cp)
+ if #o >= ct then
+ break
+ end
+ for k2,cpc in pairs(cpp) do
+ prs[cpc] = nil
+ end
+ end
+ end
+ end
+ base = base * 10
+ end
+ return o
+end
+
+if recursive_compare(cyclicpermute(123), {231, 312, 123}) then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if recursive_compare(circular(3,10), {113, 197, 199, 337, 1193, 3779,
+ 11939, 19937, 193939, 199933})
+then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-167/roger-bell-west/perl/ch-1.pl b/challenge-167/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..33b040a0c4
--- /dev/null
+++ b/challenge-167/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,96 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use experimental 'signatures';
+use List::Util qw(max);
+
+use Test::More tests => 2;
+
+is_deeply(cyclicpermute(123),
+ [231, 312, 123],
+ 'example 1');
+
+is_deeply(circular(3,10),
+ [113, 197, 199, 337, 1193, 3779, 11939, 19937, 193939,
+ 199933],
+ 'example 2');
+
+sub genprimes($mx) {
+ my @primes;
+ {
+ my %primesh=map {$_ => 1} (2,3);
+ for (my $i=6;$i <= $mx+1; $i += 6) {
+ foreach my $j ($i-1,$i+1) {
+ if ($j <= $mx) {
+ $primesh{$j}=1;
+ }
+ }
+ }
+ my @q=(2,3,5,7);
+ my $p=shift @q;
+ my $mr=int(sqrt($mx));
+ while ($p <= $mr) {
+ if ($primesh{$p}) {
+ my $i=$p*$p;
+ while ($i <= $mx) {
+ delete $primesh{$i};
+ $i += $p;
+ }
+ }
+ if (scalar @q < 2) {
+ push @q,$q[-1]+4;
+ push @q,$q[-1]+2;
+ }
+ $p=shift @q;
+ }
+ @primes=sort {$a <=> $b} keys %primesh;
+ }
+ return \@primes;
+}
+
+sub cyclicpermute($n) {
+ my $ss = $n;
+ my @o;
+ foreach my $p (1..length($ss)) {
+ $ss = substr($ss,1) . substr($ss,0,1);
+ push @o,0+$ss;
+ }
+ return \@o;
+}
+
+sub circular($mindigits, $ct) {
+ my @o;
+ my $base = 1;
+ foreach my $p (2..$mindigits) {
+ $base *= 10;
+ }
+ while (scalar @o < $ct) {
+ my $pr = genprimes($base * 10);
+ my %prs = map {$_ => 1} @{$pr};
+ foreach my $cp (@{$pr}) {
+ if ($cp >= $base) {
+ my $v = 1;
+ my $cpp = cyclicpermute($cp);
+ foreach my $cpc (@{$cpp}) {
+ if (!exists $prs{$cpc}) {
+ $v = 0;
+ last;
+ }
+ }
+ if ($v) {
+ push @o,$cp;
+ if (scalar @o >= $ct) {
+ last;
+ }
+ foreach my $cpc (@{$cpp}) {
+ delete $prs{$cpc};
+ }
+ }
+ }
+ }
+ $base *= 10;
+ }
+ return \@o;
+}
diff --git a/challenge-167/roger-bell-west/perl/ch-2.pl b/challenge-167/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..adcb42df88
--- /dev/null
+++ b/challenge-167/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,50 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use experimental 'signatures';
+
+use Math::Complex;
+
+use Test::More tests => 3;
+
+my $EPSILON = 1e-7;
+
+my @p = (676.5203681218851,
+ -1259.1392167224028,
+ 771.32342877765313,
+ -176.61502916214059,
+ 12.507343278686905,
+ -0.13857109526572012,
+ 9.9843695780195716e-6,
+ 1.5056327351493116e-7);
+
+cmp_ok(abs(gamma(3)-2), '<=', $EPSILON,'example 1');
+cmp_ok(abs(gamma(5)-24), '<=', $EPSILON,'example 2');
+cmp_ok(abs(gamma(7)-720), '<=', $EPSILON,'example 3');
+
+sub drop_imag($z0) {
+ my $z = $z0;
+ if (abs(Im($z0)) <= $EPSILON) {
+ $z = Math::Complex->make(Re($z),0);
+ }
+ return $z;
+}
+
+sub gamma($z0) {
+ my $z = Math::Complex->make($z0,0);
+ my $y;
+ if (Re($z) < 0.5) {
+ $y = pi / (sin(pi * $z) * gamma(1-$z));
+ } else {
+ $z--;
+ my $x = 0.99999999999980993;
+ foreach my $i (0..$#p) {
+ $x += $p[$i] / ($z + $i + 1);
+ }
+ my $t = $z + scalar(@p) - 0.5;
+ $y = sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $x;
+ }
+ return drop_imag($y);
+}
diff --git a/challenge-167/roger-bell-west/postscript/ch-1.ps b/challenge-167/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..4b554f0148
--- /dev/null
+++ b/challenge-167/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,281 @@
+%!PS
+
+% begin library code
+
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+/deepeq {
+ 2 dict begin
+ /a exch def
+ /b exch def
+ a type b type eq {
+ a type /dicttype eq {
+ a length b length eq {
+ <<
+ a {
+ pop
+ true
+ } forall
+ b {
+ pop
+ true
+ } forall
+ >>
+ true exch
+ {
+ pop
+ dup a exch known {
+ dup b exch known {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ } if
+ } {
+ false
+ } ifelse
+ } {
+ false
+ } ifelse
+ } forall
+ } {
+ false
+ } ifelse
+ } {
+ a type dup /arraytype eq exch /stringtype eq or {
+ a length b length eq {
+ true
+ 0 1 a length 1 sub {
+ dup a exch get exch b exch get deepeq not {
+ pop false
+ exit
+ } if
+ } for
+ } {
+ false
+ } ifelse
+ } {
+ a b eq
+ } ifelse
+ } ifelse
+ } {
+ false
+ } ifelse
+ end
+} bind def
+
+/quicksort { % [ a c b ] -> [ a b c ]
+ 1 dict begin
+ /arr exch def
+ 0 arr length 1 sub quicksort.main
+ arr
+ end
+} bind def
+
+/quicksort.main { % lo hi -> (null)
+ 3 dict begin
+ /hi exch def
+ /lo exch def
+ /xit false def
+ lo 0 lt {
+ /xit true def
+ } if
+ hi 0 lt {
+ /xit true def
+ } if
+ lo hi ge {
+ /xit true def
+ } if
+ xit not {
+ /p quicksort.partition def
+ lo p quicksort.main
+ p 1 add hi quicksort.main
+ } if
+ end
+} bind def
+
+/quicksort.partition {
+ 3 dict begin
+ /pivot arr hi lo add 2 idiv get def
+ /i lo 1 sub def
+ /j hi 1 add def
+ {
+ {
+ /i i 1 add def
+ arr i get pivot ge {
+ exit
+ } if
+ } loop
+ {
+ /j j 1 sub def
+ arr j get pivot le {
+ exit
+ } if
+ } loop
+ i j ge {
+ j
+ exit
+ } if
+ i j quicksort.swap
+ } loop
+ end
+} bind def
+
+/quicksort.swap {
+ 2 dict begin
+ /bi exch def
+ /ai exch def
+ arr ai get
+ arr bi get
+ arr exch ai exch put
+ arr exch bi exch put
+ end
+} bind def
+
+/apush { % [a b] c -> [a b c]
+ exch
+ [ exch aload length 2 add -1 roll ]
+} bind def
+
+/genprimes {
+ /mx exch def
+ /primesh mx dict def
+ 2 1 3 {
+ primesh exch true put
+ } for
+ 6 6 mx 1 add {
+ dup 1 sub exch 1 add 2 exch {
+ dup mx le {
+ primesh exch true put
+ } {
+ pop
+ } ifelse
+ } for
+ } for
+ /q [ 3 5 7 ] def
+ /qi 0 def
+ /p 2 def
+ /mr mx sqrt cvi def
+ {
+ p mr le not {
+ exit
+ } if
+ primesh p known {
+ p dup mul p mx {
+ primesh exch undef
+ } for
+ } if
+ q length qi sub 2 le {
+ /q q q q length 1 sub get 4 add apush def
+ /q q q q length 1 sub get 2 add apush def
+ } if
+ /p q qi get def
+ /qi qi 1 add def
+ } loop
+ [ primesh { pop } forall ] quicksort
+} bind def
+
+/toset { % array -> dict of (array, true)
+ << exch
+ {
+ true
+ } forall
+ >>
+} bind def
+
+% end library code
+
+/cyclicpermute {
+ 3 dict begin
+ /n exch def
+ [
+ /ss n 1 sub log cvi 1 add string n exch cvs def
+ ss length {
+ /ss2 ss length string def
+ ss2 0 ss 1 ss length 1 sub getinterval putinterval
+ ss2 ss2 length 1 sub ss 0 get put
+ ss2 cvi
+ /ss ss2 def
+ } repeat
+ ]
+ end
+} bind def
+
+/circular {
+ 8 dict begin
+ /ct exch def
+ /mindigits exch def
+ /o 0 array def
+ /base 1 def
+ mindigits 1 sub {
+ /base base 10 mul def
+ } repeat
+ {
+ o length ct ge {
+ exit
+ } if
+ /pr base 10 mul genprimes def
+ /prs pr toset def
+ pr {
+ /cp exch def
+ cp base ge {
+ /v true def
+ /cpp cp cyclicpermute def
+ cpp {
+ prs exch known not {
+ /v false def
+ exit
+ } if
+ } forall
+ v {
+ /o o cp apush def
+ o length ct ge {
+ exit
+ } if
+ cpp {
+ prs exch undef
+ } forall
+ } if
+ } if
+ } forall
+ /base base 10 mul def
+ } loop
+ o
+ end
+} bind def
+
+(circular) test.start
+123 cyclicpermute [ 231 312 123 ] deepeq test
+
+3 10 circular
+[ 113 197 199 337 1193 3779 11939 19937 193939 199933 ]
+deepeq test
+
+test.end
diff --git a/challenge-167/roger-bell-west/python/ch-1.py b/challenge-167/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..5e6cb67ce6
--- /dev/null
+++ b/challenge-167/roger-bell-west/python/ch-1.py
@@ -0,0 +1,73 @@
+#! /usr/bin/python3
+
+import unittest
+
+from math import sqrt,floor
+from collections import deque
+
+def genprimes(mx):
+ primesh=set(range(2,4))
+ for i in range(6,mx+2,6):
+ for j in range(i-1,i+2,2):
+ if j <= mx:
+ primesh.add(j)
+ q=deque([2,3,5,7])
+ p=q.popleft()
+ mr=floor(sqrt(mx))
+ while p <= mr:
+ if p in primesh:
+ for i in range(p*p,mx+1,p):
+ primesh.discard(i)
+ if len(q) < 2:
+ q.append(q[-1]+4)
+ q.append(q[-1]+2)
+ p=q.popleft()
+ primes=list(primesh)
+ primes.sort()
+ return primes
+
+def cyclicpermute(n):
+ ss = str(n)
+ o = []
+ for p in range(len(ss)):
+ ss = ss[1:] + ss[0]
+ o.append(int(ss))
+ return o
+
+def circular(mindigits,ct):
+ o = []
+ base = 1
+ for p in range(mindigits-1):
+ base = base * 10
+ while len(o) < ct:
+ pr = genprimes(base * 10)
+ prs = set(pr)
+ for cp in pr:
+ if cp >= base:
+ v = True
+ cpp = cyclicpermute(cp)
+ for cpc in cpp:
+ if cpc not in prs:
+ v = False
+ break
+ if v:
+ o.append(cp)
+ if len(o) >= ct:
+ break
+ for cpc in cpp:
+ prs.discard(cpc)
+ base = base * 10
+ return o
+
+class TestCircular(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(cyclicpermute(123),
+ [231,312,123],'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(circular(3,10),
+ [113, 197, 199, 337, 1193, 3779, 11939,
+ 19937, 193939, 199933],'example 2')
+
+unittest.main()
diff --git a/challenge-167/roger-bell-west/python/ch-2.py b/challenge-167/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..881a94bec9
--- /dev/null
+++ b/challenge-167/roger-bell-west/python/ch-2.py
@@ -0,0 +1,49 @@
+#! /usr/bin/python3
+
+# taken from https://en.wikipedia.org/wiki/Lanczos_approximation
+
+import unittest
+
+from cmath import sin, sqrt, pi, exp
+
+p = [676.5203681218851
+ ,-1259.1392167224028
+ ,771.32342877765313
+ ,-176.61502916214059
+ ,12.507343278686905
+ ,-0.13857109526572012
+ ,9.9843695780195716e-6
+ ,1.5056327351493116e-7
+ ]
+
+EPSILON = 1e-07
+def drop_imag(z):
+ if abs(z.imag) <= EPSILON:
+ z = z.real
+ return z
+
+def gamma(z):
+ z = complex(z)
+ if z.real < 0.5:
+ y = pi / (sin(pi * z) * gamma(1 - z))
+ else:
+ z -= 1
+ x = 0.99999999999980993
+ for (i, pval) in enumerate(p):
+ x += pval / (z + i + 1)
+ t = z + len(p) - 0.5
+ y = sqrt(2 * pi) * t ** (z + 0.5) * exp(-t) * x
+ return drop_imag(y)
+
+class TestGamma(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertTrue(abs(gamma(3)-2) < EPSILON,'example 1')
+
+ def test_ex2(self):
+ self.assertTrue(abs(gamma(5)-24) < EPSILON,'example 2')
+
+ def test_ex3(self):
+ self.assertTrue(abs(gamma(7)-720) < EPSILON,'example 3')
+
+unittest.main()
diff --git a/challenge-167/roger-bell-west/raku/ch-1.p6 b/challenge-167/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..ebbba9b244
--- /dev/null
+++ b/challenge-167/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,91 @@
+#! /usr/bin/perl6
+
+use Test;
+plan 2;
+
+is-deeply(cyclicpermute(123),
+ [231, 312, 123],
+ 'example 1');
+
+is-deeply(circular(3,10),
+ [113, 197, 199, 337, 1193, 3779, 11939, 19937, 193939,
+ 199933],
+ 'example 2');
+
+sub genprimes($mx) {
+ my @primes;
+ {
+ my $primesh=(2,3).SetHash;
+ loop (my $i=6;$i <= $mx+1; $i += 6) {
+ for ($i-1,$i+1) -> $j {
+ if ($j <= $mx) {
+ $primesh{$j}=True;
+ }
+ }
+ }
+ my $p=2;
+ my @q=[2,3,5,7];
+ my $mr=floor(sqrt($mx));
+ while ($p <= $mr) {
+ if ($primesh{$p}:exists) {
+ my $i=$p*$p;
+ while ($i <= $mx) {
+ $primesh{$i}:delete;
+ $i += $p;
+ }
+ }
+ if (@q.elems < 2) {
+ @q.push(@q[*-1]+4);
+ @q.push(@q[*-1]+2);
+ }
+ $p=@q.shift;
+ }
+ @primes=$primesh.keys.sort;
+ }
+ return @primes;
+}
+
+sub cyclicpermute($n) {
+ my $ss = $n;
+ my @o;
+ for (1..$ss.chars) {
+ $ss = substr($ss,1) ~ substr($ss,0,1);
+ @o.push(0+$ss);
+ }
+ return @o;
+}
+
+sub circular($mindigits, $ct) {
+ my @o;
+ my $base = 1;
+ for (2..$mindigits) {
+ $base *= 10;
+ }
+ while (@o.elems < $ct) {
+ my @pr = genprimes($base * 10);
+ my $prs = @pr.SetHash;
+ for (@pr) -> $cp {
+ if ($cp >= $base) {
+ my $v = True;
+ my @cpp = cyclicpermute($cp);
+ for (@cpp) -> $cpc {
+ unless ($prs{$cpc}:exists) {
+ $v = False;
+ last;
+ }
+ }
+ if ($v) {
+ @o.push($cp);
+ if (@o.elems >= $ct) {
+ last;
+ }
+ for (@cpp) -> $cpc {
+ $prs{$cpc}:delete;
+ }
+ }
+ }
+ }
+ $base *= 10;
+ }
+ return @o;
+}
diff --git a/challenge-167/roger-bell-west/raku/ch-2.p6 b/challenge-167/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..8d27b26dee
--- /dev/null
+++ b/challenge-167/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,50 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 3;
+
+my $EPSILON = 1e-7;
+
+my @p = (676.5203681218851,
+ -1259.1392167224028,
+ 771.32342877765313,
+ -176.61502916214059,
+ 12.507343278686905,
+ -0.13857109526572012,
+ 9.9843695780195716e-6,
+ 1.5056327351493116e-7);
+
+is-approx(gamma(3),2,$EPSILON,'example 1');
+is-approx(gamma(5),24,$EPSILON,'example 2');
+is-approx(gamma(7),720,$EPSILON,'example 3');
+
+sub drop_imag($z0) {
+ my $z = $z0;
+ if (abs($z0.re) <= $EPSILON) {
+ $z = Complex.new($z.re,0);
+ }
+ return $z;
+}
+
+sub gamma($z0) {
+ my $z;
+ if ($z0.isa("Complex")) {
+ $z = Complex.new($z0.re, 0);
+ } else {
+ $z = Complex.new($z0, 0);
+ }
+ my $y;
+ if ($z.re < 0.5) {
+ $y = pi / (sin(pi * $z) * gamma(1-$z));
+ } else {
+ $z--;
+ my $x = 0.99999999999980993;
+ for (0..@p.end) -> $i {