diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-05-31 17:27:53 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-31 17:27:53 +0100 |
| commit | ab928b0f4cba2bf97c2fa0b0e229bf9df89b531e (patch) | |
| tree | 632bc688adba5d957d9e08379cec0c405c2b9466 | |
| parent | 95b68ec3530b952a89d3317f05b7da7cb6fd4145 (diff) | |
| parent | 621bacf0507f72ff7fa268f616fd687dd7611159 (diff) | |
| download | perlweeklychallenge-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
| -rwxr-xr-x | challenge-167/roger-bell-west/javascript/ch-1.js | 117 | ||||
| -rw-r--r-- | challenge-167/roger-bell-west/kotlin/ch-1.kt | 95 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/lua/ch-1.lua | 141 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/perl/ch-1.pl | 96 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/perl/ch-2.pl | 50 | ||||
| -rw-r--r-- | challenge-167/roger-bell-west/postscript/ch-1.ps | 281 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/python/ch-1.py | 73 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/python/ch-2.py | 49 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/raku/ch-1.p6 | 91 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/raku/ch-2.p6 | 50 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/ruby/ch-1.rb | 71 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/ruby/ch-2.rb | 63 | ||||
| -rwxr-xr-x | challenge-167/roger-bell-west/rust/ch-1.rs | 93 | ||||
| -rw-r--r-- | challenge-167/roger-bell-west/rust/ch-2.rs | 55 |
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 { + $x += @p[$i] / ($z + $i + 1); + } + my $t = $z + @p.elems - 0.5; + $y = sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $x; + } + return drop_imag($y); +} |
