diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-06-13 16:58:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-13 16:58:27 +0100 |
| commit | 6bd9953e783df39e0833f1043ba66bc426d6549c (patch) | |
| tree | 476755467ece3da6da0f3ce528e0daddf895ca9a | |
| parent | 8810e3636cb9c2a1b553481bf3b4ae1fc3841784 (diff) | |
| parent | 1da597bb7f6781bd251a4bf592a85b2a92fc4232 (diff) | |
| download | perlweeklychallenge-club-6bd9953e783df39e0833f1043ba66bc426d6549c.tar.gz perlweeklychallenge-club-6bd9953e783df39e0833f1043ba66bc426d6549c.tar.bz2 perlweeklychallenge-club-6bd9953e783df39e0833f1043ba66bc426d6549c.zip | |
Merge pull request #6258 from Firedrake/rogerbw-challenge-169
Solutions for challenge #169
18 files changed, 1864 insertions, 0 deletions
diff --git a/challenge-169/roger-bell-west/javascript/ch-1.js b/challenge-169/roger-bell-west/javascript/ch-1.js new file mode 100755 index 0000000000..d1ba3034c6 --- /dev/null +++ b/challenge-169/roger-bell-west/javascript/ch-1.js @@ -0,0 +1,90 @@ +#! /usr/bin/node + +// by Frank Tan +// https://stackoverflow.com/questions/38400594/javascript-deep-comparison +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 brilliant (ct) { + let base = 1; + let out = new Set; + while (true) { + let pv = genprimes(base * 10).filter(i => i >= base); + for (let ai = 0; ai < pv.length; ai++) { + for (let bi = ai; bi < pv.length; bi++) { + out.add(pv[ai] * pv[bi]); + } + } + if (out.size >= ct) { + break; + } + base *= 10; + } + let o = [...out]; + o.sort((a,b) => a-b); + o.length = ct; + return o; +} + +if (deepEqual(brilliant(20),[4, 6, 9, 10, 14, 15, 21, 25, 35, 49, 121, + 143, 169, 187, 209, 221, 247, 253, 289, + 299])) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write("\n"); diff --git a/challenge-169/roger-bell-west/javascript/ch-2.js b/challenge-169/roger-bell-west/javascript/ch-2.js new file mode 100755 index 0000000000..174d0de8cd --- /dev/null +++ b/challenge-169/roger-bell-west/javascript/ch-2.js @@ -0,0 +1,122 @@ +#! /usr/bin/node + +// by Frank Tan +// https://stackoverflow.com/questions/38400594/javascript-deep-comparison +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 gcd (m0,n0) { + let m=m0 + let n=n0 + while (n != 0) { + [m,n]=[n,m % n] + } + return m +} + +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 primefactor (n) { + let f=new Map() + let m=n + for (let p of genprimes(1+Math.floor(Math.sqrt(n)))) { + while (m % p == 0) { + m=Math.floor(m/p) + if (f.has(p)) { + f.set(p,f.get(p)+1) + } else { + f.set(p,1) + } + if (m == 1) { + break + } + } + } + if (m > 1) { + if (f.has(m)) { + f.set(m,f.get(m)+1) + } else { + f.set(m,1) + } + } + return f +} + +function achilles(ct) { + let out = []; + let n = 1; + while (true) { + n++; + let pv = [...primefactor(n).values()]; + if (pv.length > 1 && + Math.min(...pv) >= 2 && + pv.reduce((acc, x) => gcd(acc,x),pv[0]) == 1) { + out.push(n); + if (out.length >= ct) { + break; + } + } + } + return out; +} + +if (deepEqual(achilles(20),[72, 108, 200, 288, 392, 432, 500, 648, + 675, 800, 864, 968, 972, 1125, 1152, 1323, + 1352, 1372, 1568, 1800])) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write("\n"); diff --git a/challenge-169/roger-bell-west/kotlin/ch-1.kt b/challenge-169/roger-bell-west/kotlin/ch-1.kt new file mode 100644 index 0000000000..4b680bff1f --- /dev/null +++ b/challenge-169/roger-bell-west/kotlin/ch-1.kt @@ -0,0 +1,62 @@ +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 brilliant(ct: Int): List<Int> { + var base = 1 + var out = mutableSetOf<Int>() + while (true) { + val pl = genprimes(base * 10).filter{it >= base} + for (ai in 0..pl.size-1) { + for (bi in ai..pl.size-1) { + out.add( pl[ai] * pl[bi] ) + } + } + if (out.size >= ct) { + break + } + base *= 10 + } + return out.toList().sorted().subList(0,ct) +} + +fun main() { + if (brilliant(20) == listOf(4, 6, 9, 10, 14, 15, 21, 25, 35, 49, + 121, 143, 169, 187, 209, 221, 247, + 253, 289, 299)) { + print("Pass") + } else { + print("FAIL") + } + println("") +} diff --git a/challenge-169/roger-bell-west/kotlin/ch-2.kt b/challenge-169/roger-bell-west/kotlin/ch-2.kt new file mode 100644 index 0000000000..ed13770637 --- /dev/null +++ b/challenge-169/roger-bell-west/kotlin/ch-2.kt @@ -0,0 +1,99 @@ +import kotlin.math.* + +fun gcd(m0: Int,n0: Int): Int { + var m=m0 + var n=n0 + while (n != 0) { + val tmp=m % n + m = n + n = tmp + } + return m +} + +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 primefactor(n: Int): Map<Int,Int> { + var f=mutableMapOf<Int,Int>() + var m=n + for (p in genprimes(sqrt(m.toDouble()).toInt())) { + while (m % p == 0) { + m /= p + if (f.containsKey(p)) { + f[p] = f[p]!!+1 + } else { + f[p]=1 + } + } + if (m == 1) { + break + } + } + if (m > 1) { + if (f.containsKey(m)) { + f[m] = f[m]!!+1 + } else { + f[m]=1 + } + } + return f +} + +fun achilles(ct: Int): ArrayList<Int> { + var out = ArrayList<Int>() + var n = 1 + while (true) { + n += 1 + val pv = primefactor(n).values + if (pv.size > 1 && + pv.minOrNull()!! >= 2 && + pv.reduce { acc, x -> gcd(acc,x) } == 1) { + out.add(n) + if (out.size >= ct) { + break + } + } + } + return out +} + +fun main() { + if (achilles(20) == listOf(72, 108, 200, 288, 392, 432, 500, 648, + 675, 800, 864, 968, 972, 1125, 1152, + 1323, 1352, 1372, 1568, 1800)) { + print("Pass") + } else { + print("FAIL") + } + println("") +} diff --git a/challenge-169/roger-bell-west/lua/ch-1.lua b/challenge-169/roger-bell-west/lua/ch-1.lua new file mode 100755 index 0000000000..8c0fc0b1e6 --- /dev/null +++ b/challenge-169/roger-bell-west/lua/ch-1.lua @@ -0,0 +1,108 @@ +#! /usr/bin/lua + +-- 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 brilliant(n0) + local base = 1 + local out = {} + local n = 0 + while true do + pl = genprimes(base * 10) + for ai,av in pairs(pl) do + if av >= base then + for bi,bv in pairs(pl) do + if bi >= ai then + c = av * bv + if out[c] == nil then + n = n + 1 + end + out[c] = true + end + end + end + end + if n >= n0 then + break + end + base = base * 10 + end + local o = {} + for k,v in pairs(out) do + table.insert(o,k) + end + table.sort(o) + while #o > n0 do + table.remove(o) + end + return o +end + +if recursive_compare(brilliant(20), {4, 6, 9, 10, 14, 15, 21, 25, 35, + 49, 121, 143, 169, 187, 209, 221, + 247, 253, 289, 299}) then + io.write("Pass") +else + io.write("FAIL") +end +print("") diff --git a/challenge-169/roger-bell-west/lua/ch-2.lua b/challenge-169/roger-bell-west/lua/ch-2.lua new file mode 100755 index 0000000000..902ce1b6bd --- /dev/null +++ b/challenge-169/roger-bell-west/lua/ch-2.lua @@ -0,0 +1,154 @@ +#! /usr/bin/lua + +-- by hookenz at +-- https://stackoverflow.com/questions/9168058/how-to-dump-a-table-to-console +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 gcd(m0,n0) + local m,n = m0,n0 + while n ~= 0 do + m,n = n,m % n + end + return m +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 primefactor(n) + local f={} + local m=n + for k,p in pairs(genprimes(1+math.floor(math.sqrt(m)))) do + while m % p == 0 do + m=math.floor(m/p) + if f[p] == nil then + f[p]=1 + else + f[p] = f[p] + 1 + end + if m==1 then + break + end + end + end + if m>1 then + if f[m] == nil then + f[m]=1 + else + f[m] = f[m] + 1 + end + end + return f +end + +function achilles(ct) + local o = {} + local n = 1 + while true do + n = n + 1 + local pv = {} + for k,v in pairs(primefactor(n)) do + table.insert(pv,v) + end + if #pv > 1 then + if math.min(table.unpack(pv)) >= 2 then + local g = 0 + for k,v in pairs(pv) do + if g == 0 then + g = v + else + g = gcd(g,v) + end + end + if g == 1 then + table.insert(o,n) + if #o >= ct then + break + end + end + end + end + end + return o +end + +if recursive_compare(achilles(20), {72, 108, 200, 288, 392, 432, 500, + 648, 675, 800, 864, 968, 972, + 1125, 1152, 1323, 1352, 1372, + 1568, 1800}) then + io.write("Pass") +else + io.write("FAIL") +end +print("") diff --git a/challenge-169/roger-bell-west/perl/ch-1.pl b/challenge-169/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..8ee19a6e92 --- /dev/null +++ b/challenge-169/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,61 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; + +use Test::More tests => 1; + +is_deeply(brilliant(20), + [4, 6, 9, 10, 14, 15, 21, 25, 35, 49, 121, + 143, 169, 187, 209, 221, 247, 253, 289, 299], + 'example 1'); + +sub genprimes($mx) { + 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; + } + return [sort {$a <=> $b} keys %primesh]; +} + +sub brilliant($ct) { + my $base = 1; + my %out; + while (1) { + my @pl = grep {$_ >= $base} @{genprimes($base * 10)}; + foreach my $ai (0..$#pl) { + foreach my $bi ($ai..$#pl) { + $out{ $pl[$ai] * $pl[$bi] } = 1; + } + } + if (scalar keys %out >= $ct) { + last; + } + $base *= 10; + } + my @o = sort {$a <=> $b} keys %out; + splice @o,$ct; + return \@o; +} diff --git a/challenge-169/roger-bell-west/perl/ch-2.pl b/challenge-169/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..94cf5853d0 --- /dev/null +++ b/challenge-169/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,85 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; +use List::Util qw(min reduce); + +use Test::More tests => 1; + +is_deeply(achilles(20), + [72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, + 972, 1125, 1152, 1323, 1352, 1372, 1568, 1800], + 'example 1'); + +sub gcd($m,$n) { + while ($n!=0) { + ($m,$n)=($n,$m % $n); + } + return $m; +} + +sub genprimes($mx) { + 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; + } + return [sort {$a <=> $b} keys %primesh]; +} + +sub primefactor($n) { + my %f; + my $m=$n; + foreach my $p (@{genprimes(int(sqrt($n)))}) { + while ($m % $p == 0) { + $f{$p}++; + $m=int($m/$p); + if ($m == 1) { + last; + } + } + } + if ($m > 1) { + $f{$m}++; + } + return \%f; +} + +sub achilles($ct) { + my @o; + my $n = 1; + while (1) { + $n++; + my @pv = values %{primefactor($n)}; + if (scalar @pv > 1 && + min(@pv) >= 2 && + (reduce {gcd($a,$b)} @pv) == 1) { + push @o,$n; + if (scalar @o >= $ct) { + last; + } + } + } + return \@o; +} diff --git a/challenge-169/roger-bell-west/postscript/ch-1.ps b/challenge-169/roger-bell-west/postscript/ch-1.ps new file mode 100644 index 0000000000..8c675e37bf --- /dev/null +++ b/challenge-169/roger-bell-west/postscript/ch-1.ps @@ -0,0 +1,265 @@ +%!PS + +% begin included library code + +/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 + +/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 + +/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 + +/quicksort { % [ a c b ] -> [ a b c ] + 1 dict begin + /arr exch def + 0 arr length 1 sub quicksort.main + arr + end +} bind def + +/apush { apush.right } bind def + +/apush.right { % [a b] c -> [a b c] + exch + [ exch aload length 2 add -1 roll ] +} bind def + +/filter { % array proc(bool) -> array + 1 dict begin + /p exch def + [ exch + { + dup p not + { + pop + } if + } forall + ] + end +} 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 keys +} 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 + +/keys { % dict -> array of dict keys + [ exch + { + pop + } forall + ] +} 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.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 + +/test.start { + print (:) print + /test.pass 0 def + /test.count 0 def +} bind def + +% end included library code + +/brilliant { + 6 dict begin + /ct exch def + /base 1 def + /out 0 dict def + { + /pl base 10 mul 1 sub genprimes { base ge } filter def + 0 1 pl length 1 sub { + /a e |
