aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-08-26 20:37:41 +0100
committerGitHub <noreply@github.com>2019-08-26 20:37:41 +0100
commita4127b8c7f4d8c468b504a405fb14acb3598233e (patch)
treeb9f39899f22edfd12a1a92d2c4b258d341f720dd
parente6c6c4f745a730009bb3428058dc5a51b48f6f7f (diff)
parent905694386cac675b828abe9ad01bd28066a01cfe (diff)
downloadperlweeklychallenge-club-a4127b8c7f4d8c468b504a405fb14acb3598233e.tar.gz
perlweeklychallenge-club-a4127b8c7f4d8c468b504a405fb14acb3598233e.tar.bz2
perlweeklychallenge-club-a4127b8c7f4d8c468b504a405fb14acb3598233e.zip
Merge pull request #560 from andrezgz/challenge-023
challenge-023 andrezgz solution
-rw-r--r--challenge-023/andrezgz/perl5/ch-1.pl27
-rw-r--r--challenge-023/andrezgz/perl5/ch-2.pl36
2 files changed, 63 insertions, 0 deletions
diff --git a/challenge-023/andrezgz/perl5/ch-1.pl b/challenge-023/andrezgz/perl5/ch-1.pl
new file mode 100644
index 0000000000..2ae7ebd686
--- /dev/null
+++ b/challenge-023/andrezgz/perl5/ch-1.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-023/
+# Task #1
+# Create a script that prints nth order forward difference series.
+# You should be a able to pass the list of numbers and order number as command line parameters.
+# Let me show you with an example.
+# Suppose we have list (X) of numbers: 5, 9, 2, 8, 1, 6 and we would like to create 1st order forward difference series (Y).
+# So using the formula Y(i) = X(i+1) - X(i), we get the following numbers: (9-5), (2-9), (8-2), (1-8), (6-1).
+# In short, the final series would be: 4, -7, 6, -7, 5. If you noticed, it has one less number than the original series.
+# Similary you can carry on 2nd order forward difference series like: (-7-4), (6+7), (-7-6), (5+7) => -11, 13, -13, 12.
+
+use strict;
+use warnings;
+
+die "Usage: $0 <comma-separated number list> [<order number>]" if @ARGV != 2;
+
+my @list = split /,/,shift;
+die 'List should have at leat 2 numbers' if @list < 2;
+
+my $order = shift || 1;
+die 'Max order is '.$#list if $order > $#list;
+
+for (1 .. $order) {
+ @list = map {$list[$_] - $list[$_-1]} (1 .. $#list);
+ print join(',', @list).$/;
+}
diff --git a/challenge-023/andrezgz/perl5/ch-2.pl b/challenge-023/andrezgz/perl5/ch-2.pl
new file mode 100644
index 0000000000..6a89eee9b4
--- /dev/null
+++ b/challenge-023/andrezgz/perl5/ch-2.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-023/
+# Task #2
+# Create a script that prints Prime Decomposition of a given number.
+# The prime decomposition of a number is defined as a list of prime numbers which when all multiplied together,
+# are equal to that number. For example, the Prime decomposition of 228 is 2,2,3,19 as 228 = 2 * 2 * 3 * 19.
+
+use strict;
+use warnings;
+
+die "Usage: $0 <number>" if @ARGV == 0;
+my $number = shift;
+
+my @prime_decomp;
+
+foreach my $prime (prime_factors($number)){
+ do {
+ $number /= $prime;
+ push @prime_decomp, $prime;
+ } until ($number % $prime != 0);
+}
+
+print join ',', @prime_decomp;
+
+sub prime_factors {
+ my $n = shift;
+ my @r = grep {$n % $_ == 0 && is_prime($_)} (2 .. $n/2); #get prime divisors
+ return @r ? @r : ($n); # number is prime if no prime divisors were found
+}
+
+sub is_prime {
+ my $n = shift;
+ #every composite number has a prime factor less than or equal to its square root.
+ return 1 == grep {$n % $_ == 0} (1 .. sqrt $n);
+}