diff options
| -rw-r--r-- | challenge-158/cheok-yin-fung/dart/ch-1.dart | 27 | ||||
| -rw-r--r-- | challenge-158/cheok-yin-fung/dart/ch-2.dart | 33 |
2 files changed, 60 insertions, 0 deletions
diff --git a/challenge-158/cheok-yin-fung/dart/ch-1.dart b/challenge-158/cheok-yin-fung/dart/ch-1.dart new file mode 100644 index 0000000000..96faff2f0d --- /dev/null +++ b/challenge-158/cheok-yin-fung/dart/ch-1.dart @@ -0,0 +1,27 @@ +// The Weekly Challenge 158 +// Task 1 Additive Primes +// Usage: $ dart ch-1.dart [upper bound, not larger than 1000] +import 'dart:math'; + +void main(List<String> args) { + int arg = args.length > 0 && int.parse(args[0]) <= 1000 ? + int.parse(args[0]) : 100; + var small_primes = <int>[2, 3, 5, 7, 11, 13, 17]; // less than 9+9 = 18 + if (arg > 100) small_primes.addAll([19, 23, 29, 31]); + print("Upper Bound: " + arg.toString()); + var prime = <int>[2]; + LOOP: for (int i = 3; i <= arg; i+=2) { + for (int k = 0; k < prime.length && prime[k] <= sqrt(i); k++) { + if (i % prime[k] == 0) continue LOOP; + } + prime.add(i); + } + + for (int j = 0; j < prime.length; j++) { + int sum = 0; + var list = prime[j].toString().split(""); + list.forEach( (e) => sum += int.parse(e) ); + var found = small_primes.any( (p) => p == sum ); + if (found) print(prime[j]); + } +} diff --git a/challenge-158/cheok-yin-fung/dart/ch-2.dart b/challenge-158/cheok-yin-fung/dart/ch-2.dart new file mode 100644 index 0000000000..08b2ad77b0 --- /dev/null +++ b/challenge-158/cheok-yin-fung/dart/ch-2.dart @@ -0,0 +1,33 @@ +// The Weekly Challenge 158 +// Task 2 Cuban Primes +// Usage: $ dart ch-2.dart [Upper bound] +// using Wheel Factorization (though seems that it is better for sieve...) +// check result with OEIS:A002407 +import 'dart:math'; + +void main(List<String> args) { + int arg = args.length > 0 ? int.parse(args[0]) : 1000; + List rp_to_30 = <int>[1, 7, 11, 13, 17, 19, 23, 29]; + int y = 3; + int pp = 37; + if (7 <= arg) print(7); + if (19 <= arg) print(19); + List spokes = <int>[]; + for (int i = 1; i < rp_to_30.length; i++) + spokes.add( rp_to_30[i] ); // skip 1 + while (pp <= arg) { + if (pp % 5 == 0) continue; // pp must be coprime to 2 and 3. + if (spokes.last <= sqrt(pp)) { + for (int k=1; k*30 <= sqrt(pp); k++) + rp_to_30.forEach( (e) => spokes.add(e+k*30) ); + } + y++; + if (spokes.any( (d) => pp % d == 0 )) { + pp = 3*y*y + 3*y + 1; + continue; + } else { + print(pp.toString()); + pp = 3*y*y + 3*y + 1; + } + } +} |
