aboutsummaryrefslogtreecommitdiff
path: root/challenge-146
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-146')
-rw-r--r--challenge-146/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-146/laurent-rosenfeld/julia/ch-2.jl11
-rw-r--r--challenge-146/laurent-rosenfeld/perl/ch-1.pl26
-rw-r--r--challenge-146/laurent-rosenfeld/perl/ch-2.pl19
-rw-r--r--challenge-146/laurent-rosenfeld/python/ch-2.py10
-rw-r--r--challenge-146/laurent-rosenfeld/raku/ch-1.raku4
-rw-r--r--challenge-146/laurent-rosenfeld/raku/ch-2.raku12
-rw-r--r--challenge-146/laurent-rosenfeld/ring/ch-1.ring24
-rw-r--r--challenge-146/laurent-rosenfeld/ring/ch-2.ring21
9 files changed, 128 insertions, 0 deletions
diff --git a/challenge-146/laurent-rosenfeld/blog.txt b/challenge-146/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..75b6bbfcdc
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2022/01/perl-weekly-challenge-146-prime-numbers-and-fraction-tree.html
diff --git a/challenge-146/laurent-rosenfeld/julia/ch-2.jl b/challenge-146/laurent-rosenfeld/julia/ch-2.jl
new file mode 100644
index 0000000000..65a5ec63df
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/julia/ch-2.jl
@@ -0,0 +1,11 @@
+function find_parent(num, denom)
+ return num < denom ? [num, denom - num] :
+ num > denom ? [num - denom, denom] :
+ ("Error on node $num $denom");
+end
+
+for test in [ [5, 2], [2, 5], [3, 4], [3, 5], [1, 2] ]
+ parent = find_parent(test[1], test[2])
+ gd_parent = find_parent(parent[1], parent[2])
+ println("Node $test has parent $parent and grand-parent $gd_parent")
+end
diff --git a/challenge-146/laurent-rosenfeld/perl/ch-1.pl b/challenge-146/laurent-rosenfeld/perl/ch-1.pl
new file mode 100644
index 0000000000..6d62f8471e
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/perl/ch-1.pl
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+use feature "say";
+use constant MAX => 10_001;
+
+sub primes {
+ my $max = shift;
+ my @primes = (2, 3, 5);
+ my $count = 3;
+ my $candidate = $primes[-1];
+ while ($count <= $max) {
+ $candidate += 2;
+ my $not_prime = 0;
+ my $sq_cand = sqrt $candidate;
+ for my $i (@primes) {
+ $not_prime = 1, last unless $candidate % $i;
+ last if $i > $sq_cand;
+ }
+ next if $not_prime;
+ push @primes, $candidate;
+ $count ++;
+ }
+ return $primes[$max-1];
+}
+my $p = primes(MAX);
+say "$p";
diff --git a/challenge-146/laurent-rosenfeld/perl/ch-2.pl b/challenge-146/laurent-rosenfeld/perl/ch-2.pl
new file mode 100644
index 0000000000..c9b8f20cbe
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/perl/ch-2.pl
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+use feature "say";
+
+# for a node x/y less than 1, parent is x/(y-x)
+# for a node x/y larger than 1, parent is (x-y)/x
+
+sub parent {
+ my ($num, $denom) = @{$_[0]};
+ return ["Error"] if $num == $denom;
+ return $num < $denom ? [$num, $denom - $num] : [$num - $denom, $denom];
+}
+
+for my $fraction ([5, 2], [2, 5], [3, 4], [3, 5], [2, 1], [1, 1]) {
+ die "Invalid input node @$fraction" if $$fraction[0] == $$fraction[1];
+ my $parent = parent $fraction;
+ my $gd_parent = parent $parent;
+ say "for child @$fraction, parent is @$parent and gd-parent is @$gd_parent";
+}
diff --git a/challenge-146/laurent-rosenfeld/python/ch-2.py b/challenge-146/laurent-rosenfeld/python/ch-2.py
new file mode 100644
index 0000000000..7120a602a7
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/python/ch-2.py
@@ -0,0 +1,10 @@
+# for a node x/y less than 1, parent is x/(y-x)
+# for a node x/y larger than 1, parent is (x-y)/x
+
+def find_parent(num, denom):
+ return [num, denom - num] if num < denom else [num - denom, denom]
+
+for test in ([5, 2], [2, 5], [3, 4], [3, 5]):
+ parent = find_parent(test[0], test[1])
+ gd_parent = find_parent(parent[0], parent[1])
+ print("Node", test, "has parent", parent, "and grand-parent", gd_parent)
diff --git a/challenge-146/laurent-rosenfeld/raku/ch-1.raku b/challenge-146/laurent-rosenfeld/raku/ch-1.raku
new file mode 100644
index 0000000000..b181fb89cd
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/raku/ch-1.raku
@@ -0,0 +1,4 @@
+use v6;
+
+my @primes = grep { .is-prime }, (1, 2, 3, -> $a { $a + 2} ...Inf);
+say @primes[10001 - 1]; # Subtract 1 because the array starts at 0
diff --git a/challenge-146/laurent-rosenfeld/raku/ch-2.raku b/challenge-146/laurent-rosenfeld/raku/ch-2.raku
new file mode 100644
index 0000000000..22976624bc
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/raku/ch-2.raku
@@ -0,0 +1,12 @@
+use v6;
+
+# for a node x/y less than 1, parent is x/(y-x)
+# for a node x/y larger than 1, parent is (x-y)/x
+
+sub parent (\num, \denom) {
+ return num < denom ?? (num, denom - num) !! (num - denom, denom);
+}
+for (5, 2), (2, 5), (3, 4), (3, 5) -> $fraction {
+ my $parent = parent |$fraction[0,1];
+ my $gd-parent = parent |$parent[0,1];
+ say "for child $fraction, parent is $parent and gd-parent is $gd-parent";
diff --git a/challenge-146/laurent-rosenfeld/ring/ch-1.ring b/challenge-146/laurent-rosenfeld/ring/ch-1.ring
new file mode 100644
index 0000000000..bd5ecf2178
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/ring/ch-1.ring
@@ -0,0 +1,24 @@
+p = primes(10001)
+see p + nl
+
+func primes max
+ primes = [2, 3, 5]
+ count = len(primes)
+ candidate = primes[count]
+ while count < max
+ candidate += 2
+ is_prime = True
+ sqrt_cand = sqrt(candidate)
+ for i in primes
+ if candidate % i = 0
+ is_prime = False
+ exit
+ ok
+ if i > sqrt_cand exit ok
+ next
+ if is_prime
+ add(primes, candidate)
+ count ++
+ ok
+ end
+ return primes[max]
diff --git a/challenge-146/laurent-rosenfeld/ring/ch-2.ring b/challenge-146/laurent-rosenfeld/ring/ch-2.ring
new file mode 100644
index 0000000000..78b9092395
--- /dev/null
+++ b/challenge-146/laurent-rosenfeld/ring/ch-2.ring
@@ -0,0 +1,21 @@
+# for a node x/y less than 1, parent is x/(y-x)
+# for a node x/y larger than 1, parent is (x-y)/x
+
+for test in [ [5, 2], [2, 5], [3, 4], [3,5], [6, 2], [1, 2] ]
+ parent = find_parent(test[1], test[2])
+ gd_parent = find_parent(parent[1], parent[2])
+ see "Node " + to_str(test) + " has parent " + to_str(parent) +
+ " and grand-parent " + to_str(gd_parent) + nl
+next
+
+func find_parent num, denom
+ if num < denom
+ return [num, denom - num]
+ but denom < num
+ return [num - denom, denom]
+ else
+ return ["Error", ""]
+ ok
+
+func to_str input
+ return "" + input[1] + " " + input[2]