aboutsummaryrefslogtreecommitdiff
path: root/challenge-159/roger-bell-west/javascript
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-159/roger-bell-west/javascript')
-rwxr-xr-xchallenge-159/roger-bell-west/javascript/ch-1.js97
-rwxr-xr-xchallenge-159/roger-bell-west/javascript/ch-2.js94
2 files changed, 191 insertions, 0 deletions
diff --git a/challenge-159/roger-bell-west/javascript/ch-1.js b/challenge-159/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..c18b03883d
--- /dev/null
+++ b/challenge-159/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,97 @@
+#! /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 gcd (m0,n0) {
+ let m=m0
+ let n=n0
+ while (n != 0) {
+ [m,n]=[n,m % n]
+ }
+ return m
+}
+
+function lcm (m,n) {
+ return m/gcd(m,n)*n
+}
+
+function lcmseries(a0,b) {
+ let a=a0
+ for (let i=a+1;i <= b;i++) {
+ a=lcm(a,i)
+ }
+ return a
+}
+
+function farey (n) {
+ let l=lcmseries(2,n)
+ let d=new Map()
+ let s=[]
+ for (let i=1;i <= n;i++) {
+ let m=l/i
+ for (let j=0;j <= i;j++) {
+ let k=m*j
+ if (!d.has(k)) {
+ d.set(k,[j,i])
+ s.push(k)
+ }
+ }
+ }
+ s.sort(function(a,b) {
+ return a-b;
+ })
+ return s.map(i => d.get(i))
+}
+
+if (deepEqual(farey(5),[
+ [0, 1], [1, 5], [1, 4], [1, 3], [2, 5], [1, 2], [3, 5], [2, 3],
+ [3, 4], [4, 5], [1, 1]
+])) {
+ process.stdout.write("Pass")
+} else {
+ process.stdout.write("FAIL")
+}
+process.stdout.write(" ");
+
+if (deepEqual(farey(7),[
+ [0, 1], [1, 7], [1, 6], [1, 5], [1, 4], [2, 7], [1, 3], [2, 5],
+ [3, 7], [1, 2], [4, 7], [3, 5], [2, 3], [5, 7], [3, 4], [4, 5],
+ [5, 6], [6, 7], [1, 1]
+])) {
+ process.stdout.write("Pass")
+} else {
+ process.stdout.write("FAIL")
+}
+process.stdout.write(" ");
+
+if (deepEqual(farey(4),[
+ [0, 1], [1, 4], [1, 3], [1, 2], [2, 3], [3, 4], [1, 1]
+])) {
+ process.stdout.write("Pass")
+} else {
+ process.stdout.write("FAIL")
+}
+process.stdout.write("\n");
diff --git a/challenge-159/roger-bell-west/javascript/ch-2.js b/challenge-159/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..619b239213
--- /dev/null
+++ b/challenge-159/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,94 @@
+#! /usr/bin/node
+
+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(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 moebius (n) {
+ let z=0
+ for (let v of primefactor(n).values()) {
+ if (v > 1) {
+ return 0
+ }
+ z++
+ }
+ if (z % 2 == 0) {
+ return 1
+ }
+ return -1
+}
+
+if (moebius(5) == -1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (moebius(10) == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (moebius(20) == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");