aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-158/cheok-yin-fung/dart/ch-1.dart27
-rw-r--r--challenge-158/cheok-yin-fung/dart/ch-2.dart33
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;
+ }
+ }
+}