diff options
Diffstat (limited to 'challenge-012')
| -rw-r--r-- | challenge-012/zapwai/README | 1 | ||||
| -rw-r--r-- | challenge-012/zapwai/c/ch-1.c | 61 | ||||
| -rw-r--r-- | challenge-012/zapwai/c/ch-2.c | 34 | ||||
| -rw-r--r-- | challenge-012/zapwai/javascript/ch-1.js | 49 | ||||
| -rw-r--r-- | challenge-012/zapwai/javascript/ch-2.js | 23 | ||||
| -rw-r--r-- | challenge-012/zapwai/perl/ch-1.pl | 58 | ||||
| -rw-r--r-- | challenge-012/zapwai/perl/ch-2.pl | 26 | ||||
| -rw-r--r-- | challenge-012/zapwai/python/ch-1.py | 37 | ||||
| -rw-r--r-- | challenge-012/zapwai/python/ch-2.py | 19 | ||||
| -rw-r--r-- | challenge-012/zapwai/rust/ch-1.rs | 53 | ||||
| -rw-r--r-- | challenge-012/zapwai/rust/ch-2.rs | 25 |
11 files changed, 386 insertions, 0 deletions
diff --git a/challenge-012/zapwai/README b/challenge-012/zapwai/README new file mode 100644 index 0000000000..037b3777ef --- /dev/null +++ b/challenge-012/zapwai/README @@ -0,0 +1 @@ +Solutions by David Ferrone. diff --git a/challenge-012/zapwai/c/ch-1.c b/challenge-012/zapwai/c/ch-1.c new file mode 100644 index 0000000000..075a4490a4 --- /dev/null +++ b/challenge-012/zapwai/c/ch-1.c @@ -0,0 +1,61 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#define MAX_PRIME_VALUE 15000 + +int* fill_primes(int* primes_length) { + int* primes = malloc(MAX_PRIME_VALUE * sizeof(int)); + primes[0] = 2; + for (int i = 3; i < MAX_PRIME_VALUE; i++) { + int cnt = 0; + for (int j = 0; j < *primes_length; j++) + if (i % primes[j] == 0) + cnt++; + if (cnt == 0) { + primes[*primes_length] = i; + (*primes_length)++; + } + } + return primes; +} + +bool is_prime(int num, int* primes, int primes_length) { + for (int i = 0; i < primes_length; i++) { + if (primes[i] < num) { + if (num % primes[i] == 0) { + return false; + } + } + else { + break; + } + } + return true; +} + +int primorial(int n, int* primes) { + int p = 1; + while (n > 0) { + n--; + p *= primes[n]; + } + return p; +} + +int euclid(int n, int* primes) { + return 1 + primorial(n, primes); +} + +int main() { + int primes_length = 1; + int* primes = fill_primes(&primes_length); + for (int i = 0; i < 8; i++) { + int x = euclid(i, primes); + if (!is_prime(x, primes, primes_length)) { + printf("%d\n", x); + break; + } + } + + free(primes); +} diff --git a/challenge-012/zapwai/c/ch-2.c b/challenge-012/zapwai/c/ch-2.c new file mode 100644 index 0000000000..752f7220fc --- /dev/null +++ b/challenge-012/zapwai/c/ch-2.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +void proc(char* input) { + char* cp = strdup(input); + char* line = strtok(cp, "\n"); + char prefix[100] = {}; + strcpy(prefix, line); + int cnt = 0; + do { + cnt = 0; + do { + int slen = strlen(prefix); + prefix[slen - 1] = '\0'; + } while (prefix[strlen(prefix) - 1] != '/'); + while (line != NULL) { + for (int i = 0; i < strlen(prefix); i++) + if (prefix[i] != line[i]) + cnt++; + line = strtok(NULL, "\n"); + } + } while (cnt > 0); + free(cp); + printf("%s\n", prefix); +} + +int main() { + char* s = "/a/b/c/d\n" + "/a/b/cd\n" + "/a/b/cc\n" + "/a/b/c/d/e\n"; + proc(s); +} diff --git a/challenge-012/zapwai/javascript/ch-1.js b/challenge-012/zapwai/javascript/ch-1.js new file mode 100644 index 0000000000..f16531410b --- /dev/null +++ b/challenge-012/zapwai/javascript/ch-1.js @@ -0,0 +1,49 @@ +let primes = [2]; + +function is_prime(num) { + for (let p of primes) { + if (p < num) { + if (num % p == 0) + return false; + } + else { + break; + } + } + return true; +} + +function primorial(n) { + let p = 1; + while (n > 0) { + n--; + p *= primes[n]; + } + return p; +} + +function fill_primes(num) { + let i = 2; + while (primes[primes.length-1] < num) { + i++; + let cnt = 0; + for (let j = 0; j < primes.length; j++) { + if (i % primes[j] == 0) + cnt++; + } + if (cnt == 0) + primes.push(i); + } +} + +function euclid(i) { + return 1 + primorial(i); +} + +fill_primes(15000); +for (let i = 2; i < 8; i++) { + if (!(is_prime(euclid(i)))) { + console.log(euclid(i)); + break; + } +} diff --git a/challenge-012/zapwai/javascript/ch-2.js b/challenge-012/zapwai/javascript/ch-2.js new file mode 100644 index 0000000000..fecd56d950 --- /dev/null +++ b/challenge-012/zapwai/javascript/ch-2.js @@ -0,0 +1,23 @@ +let input = `/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e`; + +function proc(input) { + let line = input.split("\n"); + let prefix = line[0]; + let cnt = 1; + while (cnt > 0) { + cnt = 0; + prefix = prefix.slice(0,prefix.lastIndexOf("/")); + for (let i = 0; i < line.length; i++) { + let pattern = new RegExp("^"+prefix+"/"); + if (!pattern.test(line[i])) { + cnt++; + } + } + } + return prefix; +} + +console.log(proc(input)) diff --git a/challenge-012/zapwai/perl/ch-1.pl b/challenge-012/zapwai/perl/ch-1.pl new file mode 100644 index 0000000000..e079a13127 --- /dev/null +++ b/challenge-012/zapwai/perl/ch-1.pl @@ -0,0 +1,58 @@ +use v5.38; +my @primes = (2); + +sub is_prime($num) { + for my $p (@primes) { + if ($p < $num) { + return 0 if ($num % $p == 0); + } + else { + last; + } + } + 1 +} + +sub fill_more_primes($lim) { + my $i = $primes[$#primes]; + while ($primes[$#primes] < $lim) { + $i++; + my $cnt = scalar grep { $i % $_ == 0 } @primes; + push @primes, $i if ($cnt == 0); + } +} + +sub fill_primes_bycnt($num) { + my $i = 2; + while (@primes < $num) { + $i++; + my $cnt = scalar grep { $i % $_ == 0 } @primes; + push @primes, $i if ($cnt == 0); + } +} + +sub primorial($n) { + my $p = 1; + while ($n > 0) { + $n--; + $p *= $primes[$n]; + } + $p +} + +sub proc($n) { + fill_primes_bycnt($n); + my @primorials = map primorial($_), (1 .. $n); + fill_more_primes(sqrt $primorials[$#primorials]); + say "Euclid numbers:"; + foreach my $prim (@primorials) { + if (!is_prime($prim+1)) { + say $prim+1," <- not prime!"; + last; + } + say $prim+1; + } +} + +proc(7); + diff --git a/challenge-012/zapwai/perl/ch-2.pl b/challenge-012/zapwai/perl/ch-2.pl new file mode 100644 index 0000000000..ab87ba1937 --- /dev/null +++ b/challenge-012/zapwai/perl/ch-2.pl @@ -0,0 +1,26 @@ +use v5.38; + +my $input = <<"ENDL"; +/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e +ENDL + +sub proc($input) { + my @line = split("\n", $input); + my $prefix = $line[0]; + my $cnt = 0; + do { + $cnt = 0; + $prefix = substr $prefix, 0, rindex($prefix, "/"); + for my $i (0 .. $#line) { + if ($line[$i] !~ /^$prefix\//) { + $cnt++; + } + } + } while($cnt > 0); + return $prefix; +} + +say proc($input); diff --git a/challenge-012/zapwai/python/ch-1.py b/challenge-012/zapwai/python/ch-1.py new file mode 100644 index 0000000000..c085e70142 --- /dev/null +++ b/challenge-012/zapwai/python/ch-1.py @@ -0,0 +1,37 @@ + +def fill_primes(num): + i = 2 + while primes[len(primes) - 1] < num: + i += 1 + cnt = 0 + for p in primes: + if i % p == 0: + cnt += 1 + if cnt == 0: + primes.append(i) + +def is_prime(num): + for p in primes: + if p < num: + if num % p == 0: + return False + else: + break + return True + +def primorial(n): + p = 1 + while n > 0: + n -= 1 + p *= primes[n] + return p + +def euclid(n): + return 1 + primorial(n) + +primes = [2] +fill_primes(15000) +for i in range(8): + if not is_prime(euclid(i)): + print(euclid(i)) + break diff --git a/challenge-012/zapwai/python/ch-2.py b/challenge-012/zapwai/python/ch-2.py new file mode 100644 index 0000000000..14580e9a23 --- /dev/null +++ b/challenge-012/zapwai/python/ch-2.py @@ -0,0 +1,19 @@ +import re +input = """/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e""" + +def proc(input): + line = input.split() + prefix = line[0] + cnt = 1 + while cnt > 0: + cnt = 0 + prefix = prefix[0:prefix.rindex("/")] + for i in range(len(line)): + if not re.search("^"+prefix+"\/", line[i]): + cnt += 1 + return prefix + +print(proc(input)) diff --git a/challenge-012/zapwai/rust/ch-1.rs b/challenge-012/zapwai/rust/ch-1.rs new file mode 100644 index 0000000000..f46af23304 --- /dev/null +++ b/challenge-012/zapwai/rust/ch-1.rs @@ -0,0 +1,53 @@ +fn fill_primes(num :i32, primes :&mut Vec<i32> ) { + let mut i = 2; + while primes[primes.len() - 1] < num { + i += 1; + let mut cnt = 0; + for p in &mut *primes { + if i % *p == 0 { + cnt += 1; + } + } + if cnt == 0 { + primes.push(i); + } + } +} + +fn is_prime(num :i32, primes :&Vec<i32>) -> bool { + for p in primes { + if p < &num { + if num % p == 0 { + return false; + } + } else { + break; + } + } + return true; +} + +fn primorial(n :i32, primes :&Vec<i32>) -> i32 { + let mut p = 1; + let mut i = n as usize; + while i > 0 { + i -= 1; + p *= primes[i]; + } + return p; +} + +fn euclid(n :i32, primes : &Vec<i32>) -> i32 { + return 1 + primorial(n, primes); +} + +fn main() { + let mut primes = vec![2]; + fill_primes(15000, &mut primes); + for i in 0 .. 8 { + if !is_prime(euclid(i, &primes), &primes) { + println!("{}", euclid(i, &primes)); + break; + } + } +} diff --git a/challenge-012/zapwai/rust/ch-2.rs b/challenge-012/zapwai/rust/ch-2.rs new file mode 100644 index 0000000000..093ecc99e5 --- /dev/null +++ b/challenge-012/zapwai/rust/ch-2.rs @@ -0,0 +1,25 @@ +use regex::Regex; +fn main() { + let inp = "/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e"; + let mut alines = inp.split('\n'); + let mut prefix = alines.next().unwrap(); + let mut cnt = 1; + while cnt > 0 { + cnt = 0; + let lind = prefix.rfind('/').unwrap_or(0); + prefix = &prefix[0..lind]; + let a = format!(r"^{}/", prefix); + let re = Regex::new(&a).unwrap(); + let lines = inp.split('\n'); + for line in lines { + if !re.is_match(line) { + cnt += 1; + } + } + } + println!("{prefix}"); +} + |
