aboutsummaryrefslogtreecommitdiff
path: root/challenge-041
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-01-05 22:18:42 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-01-05 22:18:42 +0000
commitca8bb6ed0261838bbc9440bdd3a97bf5576a23c7 (patch)
tree30e74a867f5ce7e9340db11695ab48e5857bc656 /challenge-041
parentb722756670309a05aaaa86cbf04e5adae7a1d800 (diff)
downloadperlweeklychallenge-club-ca8bb6ed0261838bbc9440bdd3a97bf5576a23c7.tar.gz
perlweeklychallenge-club-ca8bb6ed0261838bbc9440bdd3a97bf5576a23c7.tar.bz2
perlweeklychallenge-club-ca8bb6ed0261838bbc9440bdd3a97bf5576a23c7.zip
- Added solutions by Kevin Colyer.
Diffstat (limited to 'challenge-041')
-rw-r--r--challenge-041/kevin-colyer/perl6/ch-1.p665
-rw-r--r--challenge-041/kevin-colyer/perl6/ch-2.p628
2 files changed, 93 insertions, 0 deletions
diff --git a/challenge-041/kevin-colyer/perl6/ch-1.p6 b/challenge-041/kevin-colyer/perl6/ch-1.p6
new file mode 100644
index 0000000000..74971ff37e
--- /dev/null
+++ b/challenge-041/kevin-colyer/perl6/ch-1.p6
@@ -0,0 +1,65 @@
+#!/usr/bin/perl6
+use v6;
+
+use Test;
+
+
+=begin pod
+
+TASK #1
+Write a script to display attractive number between 1 and 50.
+A number is an attractive number if the number of its prime factors is also prime number.
+
+The number 20 is an attractive number, whose prime factors are 2, 2 and 5. The total prime factors is 3 which is also a prime number.
+
+=end pod
+
+# Factorize prime number
+my @primes = lazy (2,3,*+2 ... ∞).grep: *.is-prime;
+
+say "List of Attractive Numbers from 1 to 50";
+say "$_ => "~attractiveNumber($_) for 1..50;
+
+
+
+sub attractiveNumber($n, $verbose=False) {
+ # 0th candidate number not useful
+ # 1st is 2
+ # 2nd is ? not 3 as prime so... start looking for candidates at 4
+ state @aN = 0,2;
+ state $cand=4;
+ say "Seeking {$n}th attractive Number " if $verbose;
+ return @aN[$n] if @aN[$n]; # return the nth attractiveNumber if we have seen it!
+ my $numfactors;
+ loop {
+ if $cand.is-prime { $cand++; next }
+ print "Selecting $cand ..." if $verbose;
+ $numfactors=factors($cand).elems;
+ last if $numfactors.is-prime; # found attractiveNumber so finish
+ say " has $numfactors factors (NOT prime)" if $verbose;
+ $cand++; # keep looking
+ }
+ say " has $numfactors factors (prime)" if $verbose;
+ @aN[$n]=$cand;
+ $cand++; # inc for next time
+ return @aN[$n];
+}
+
+
+sub factors(Int $number) {
+ my @factors;
+ my $n = $number;
+ my $i=0;
+ while $n>1 {
+ my $p=@primes[$i];
+ #say "{$i}th prime is -> $p";
+ if $n %% $p {
+ @factors.push: $p;
+ $n/=$p;
+ #say "found $p, now n is $n";
+ next
+ };
+ $i++;
+ }
+ @factors;
+}
diff --git a/challenge-041/kevin-colyer/perl6/ch-2.p6 b/challenge-041/kevin-colyer/perl6/ch-2.p6
new file mode 100644
index 0000000000..16d8fc6931
--- /dev/null
+++ b/challenge-041/kevin-colyer/perl6/ch-2.p6
@@ -0,0 +1,28 @@
+#!/usr/bin/perl6
+use v6;
+
+use Test;
+
+
+=begin pod
+
+Write a script to display first 20 Leonardo Numbers. Please checkout wiki page for more information.
+For example:
+
+L(0) = 1
+L(1) = 1
+L(2) = L(0) + L(1) + 1 = 3
+L(3) = L(1) + L(2) + 1 = 5
+and so on.
+
+=end pod
+
+my @cache;
+multi sub Leonardo(Int:D $n where * == 0) { 1 }
+multi sub Leonardo(Int:D $n where * == 1) { 1 }
+multi sub Leonardo(Int:D $n where * > 1 ) {
+ return @cache[$n] if @cache[$n];
+ return @cache[$n] = Leonardo($n-1)+Leonardo($n-2)+1;
+}
+
+say "$_ -> "~Leonardo($_) for ^21;