aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-09-15 13:51:54 +0100
committerGitHub <noreply@github.com>2020-09-15 13:51:54 +0100
commit62703ba4f77e74b9fab081ff9a823c4e26361341 (patch)
tree7aa332f9675bfa460a0a01e467caf3f5aafa7a19
parent10415d982fcc8001ed941a3530dea0d65a9772b1 (diff)
parent1801e66819957b886808c2e98508ca190d2b2432 (diff)
downloadperlweeklychallenge-club-62703ba4f77e74b9fab081ff9a823c4e26361341.tar.gz
perlweeklychallenge-club-62703ba4f77e74b9fab081ff9a823c4e26361341.tar.bz2
perlweeklychallenge-club-62703ba4f77e74b9fab081ff9a823c4e26361341.zip
Merge pull request #2300 from Abigail/week_078/abigail
Week 078/abigail
-rw-r--r--challenge-078/abigail/Part1/input11
-rw-r--r--challenge-078/abigail/Part1/input21
-rw-r--r--challenge-078/abigail/Part1/input32
-rw-r--r--challenge-078/abigail/Part1/output1.exp1
-rw-r--r--challenge-078/abigail/Part1/output2.exp1
-rw-r--r--challenge-078/abigail/Part1/output3.exp1
-rw-r--r--challenge-078/abigail/Part1/solution.js52
-rwxr-xr-xchallenge-078/abigail/Part1/solution.pl43
-rw-r--r--challenge-078/abigail/Part2/input12
-rw-r--r--challenge-078/abigail/Part2/input22
-rw-r--r--challenge-078/abigail/Part2/output1.exp2
-rw-r--r--challenge-078/abigail/Part2/output2.exp3
-rw-r--r--challenge-078/abigail/Part2/solution.js33
-rwxr-xr-xchallenge-078/abigail/Part2/solution.pl42
-rwxr-xr-xchallenge-078/abigail/test.pl44
15 files changed, 230 insertions, 0 deletions
diff --git a/challenge-078/abigail/Part1/input1 b/challenge-078/abigail/Part1/input1
new file mode 100644
index 0000000000..9a2d61d8c5
--- /dev/null
+++ b/challenge-078/abigail/Part1/input1
@@ -0,0 +1 @@
+9 10 7 5 6 1
diff --git a/challenge-078/abigail/Part1/input2 b/challenge-078/abigail/Part1/input2
new file mode 100644
index 0000000000..02c7bd24aa
--- /dev/null
+++ b/challenge-078/abigail/Part1/input2
@@ -0,0 +1 @@
+3 4 5
diff --git a/challenge-078/abigail/Part1/input3 b/challenge-078/abigail/Part1/input3
new file mode 100644
index 0000000000..139597f9cb
--- /dev/null
+++ b/challenge-078/abigail/Part1/input3
@@ -0,0 +1,2 @@
+
+
diff --git a/challenge-078/abigail/Part1/output1.exp b/challenge-078/abigail/Part1/output1.exp
new file mode 100644
index 0000000000..65f1fa0ab1
--- /dev/null
+++ b/challenge-078/abigail/Part1/output1.exp
@@ -0,0 +1 @@
+10 7 6 1
diff --git a/challenge-078/abigail/Part1/output2.exp b/challenge-078/abigail/Part1/output2.exp
new file mode 100644
index 0000000000..7ed6ff82de
--- /dev/null
+++ b/challenge-078/abigail/Part1/output2.exp
@@ -0,0 +1 @@
+5
diff --git a/challenge-078/abigail/Part1/output3.exp b/challenge-078/abigail/Part1/output3.exp
new file mode 100644
index 0000000000..573541ac97
--- /dev/null
+++ b/challenge-078/abigail/Part1/output3.exp
@@ -0,0 +1 @@
+0
diff --git a/challenge-078/abigail/Part1/solution.js b/challenge-078/abigail/Part1/solution.js
new file mode 100644
index 0000000000..eba11fd3b3
--- /dev/null
+++ b/challenge-078/abigail/Part1/solution.js
@@ -0,0 +1,52 @@
+//
+// Exercise:
+// You are given an array @A containing distinct integers.
+// Write a script to find all leader elements in the array @A.
+// Print (0) if none found. An element is leader if it is greater
+// than all the elements to its right side.
+//
+
+//
+// Note:
+// - The only way no leader element can be found is if the array is empty.
+// - We will read the array from STDIN.
+//
+
+//
+// Read a line from STDIN, turn it into a string, strip off the
+// trailing newline (and any leading or trailing whitespace),
+// and then split in on spaces. Store the result into an array "arry".
+//
+let fs = require ("fs");
+let line = fs . readFileSync (0) . toString () . trim ();
+let arry = line . split (" ");
+
+if (line . length == 0) {
+ //
+ // Special case, if the line is empty, output 0
+ //
+ console . log (0);
+}
+else {
+ //
+ // Iterate backwards over the array. Keep track of the largest
+ // element so far in an array 'out'. If we find a new largest
+ // element, put this first in 'out' (so, the largest element
+ // seen so far is always in 'out [0]'.
+ //
+ let out = [arry [arry . length - 1]];
+ for (let i = arry . length - 2; i >= 0; i --) {
+ //
+ // Note that we have strings in arry (and hence, out).
+ // An unary + casts them to numbers.
+ //
+ if (+arry [i] > +out [0]) {
+ out . unshift (arry [i]);
+ }
+ }
+
+ //
+ // Print the result.
+ //
+ console . log (out . join (" "));
+}
diff --git a/challenge-078/abigail/Part1/solution.pl b/challenge-078/abigail/Part1/solution.pl
new file mode 100755
index 0000000000..e74cbbb0c4
--- /dev/null
+++ b/challenge-078/abigail/Part1/solution.pl
@@ -0,0 +1,43 @@
+#!/opt/perl/bin/perl
+
+#
+# Exercise:
+# You are given an array @A containing distinct integers.
+# Write a script to find all leader elements in the array @A.
+# Print (0) if none found. An element is leader if it is greater
+# than all the elements to its right side.
+#
+
+#
+# Note:
+# - The only way no leader element can be found is if the array is empty.
+# - We will read the array from STDIN.
+#
+
+use 5.032;
+
+use strict;
+use warnings;
+no warnings 'syntax';
+
+use experimental 'signatures';
+
+my $max;
+
+#
+# Read the input, extract integers, and store them in @A.
+# If the input is empty, print 0 and exit.
+#
+say (0), exit unless my @A = <> =~ /[0-9]+/g;
+
+local $, = " ";
+
+#
+# Reverse the array, and extract each element which was larger
+# than any seen before (keep state in $max), then reverse it
+# again before printing.
+#
+
+say reverse
+ grep {!defined $max || $_ > $max ? do {$max = $_; 1} : 0}
+ reverse @A;
diff --git a/challenge-078/abigail/Part2/input1 b/challenge-078/abigail/Part2/input1
new file mode 100644
index 0000000000..6ed39f8f4d
--- /dev/null
+++ b/challenge-078/abigail/Part2/input1
@@ -0,0 +1,2 @@
+10 20 30 40 50
+3 4
diff --git a/challenge-078/abigail/Part2/input2 b/challenge-078/abigail/Part2/input2
new file mode 100644
index 0000000000..fda601bebf
--- /dev/null
+++ b/challenge-078/abigail/Part2/input2
@@ -0,0 +1,2 @@
+7 4 2 6 3
+1 3 4
diff --git a/challenge-078/abigail/Part2/output1.exp b/challenge-078/abigail/Part2/output1.exp
new file mode 100644
index 0000000000..6569215fd4
--- /dev/null
+++ b/challenge-078/abigail/Part2/output1.exp
@@ -0,0 +1,2 @@
+40 50 10 20 30
+50 10 20 30 40
diff --git a/challenge-078/abigail/Part2/output2.exp b/challenge-078/abigail/Part2/output2.exp
new file mode 100644
index 0000000000..819d56ba14
--- /dev/null
+++ b/challenge-078/abigail/Part2/output2.exp
@@ -0,0 +1,3 @@
+4 2 6 3 7
+6 3 7 4 2
+3 7 4 2 6
diff --git a/challenge-078/abigail/Part2/solution.js b/challenge-078/abigail/Part2/solution.js
new file mode 100644
index 0000000000..6d76c9aa91
--- /dev/null
+++ b/challenge-078/abigail/Part2/solution.js
@@ -0,0 +1,33 @@
+//
+// Exercise:
+//
+// You are given array @A containing positive numbers and @B containing
+// one or more indices from the array @A.
+// Write a script to left rotate @A so that the number at the first index
+// of @B becomes the first element in the array. Similary, left rotate @A
+// again so that the number at the second index of @B becomes the first
+// element in the array.
+//
+// We will be reading the arrays from STDIN -- @A is one the first
+// line, @B is on the second line.
+//
+
+//
+// Read two lines from STDIN, turn it into a string, strip off the
+// trailing newline (and any leading or trailing whitespace),
+// and then split in on spaces. Store the result into an arrays A and B.
+//
+let fs = require ("fs");
+let lines = fs . readFileSync (0) . toString () . split ("\n");
+let A = lines [0] . trim () . split (" ");
+let B = lines [1] . trim () . split (" ");
+
+
+//
+// Iterate over the array B, and print the slices of A.
+//
+for (let i = 0; i < B . length; i ++) {
+ let index = +B [i];
+ console . log (A . slice ( index) . join (" ") + " " +
+ A . slice (0, index) . join (" "));
+}
diff --git a/challenge-078/abigail/Part2/solution.pl b/challenge-078/abigail/Part2/solution.pl
new file mode 100755
index 0000000000..80e8f4907d
--- /dev/null
+++ b/challenge-078/abigail/Part2/solution.pl
@@ -0,0 +1,42 @@
+#!/opt/perl/bin/perl
+
+#
+# Exercise:
+#
+# You are given array @A containing positive numbers and @B containing
+# one or more indices from the array @A.
+# Write a script to left rotate @A so that the number at the first index
+# of @B becomes the first element in the array. Similary, left rotate @A
+# again so that the number at the second index of @B becomes the first
+# element in the array.
+#
+
+#
+# We will be reading the arrays from STDIN -- @A is one the first
+# line, @B is on the second line.
+#
+
+use 5.032;
+
+use strict;
+use warnings;
+no warnings 'syntax';
+
+use experimental 'signatures';
+
+#
+# Read @A and @B
+#
+chomp (my @A = split / / => scalar <>);
+chomp (my @B = split / / => scalar <>);
+
+#
+# Print the rotations.
+#
+foreach my $index (@B) {
+ local $, = " ";
+ say @A [$index .. @A - 1, 0 .. $index - 1];
+}
+
+
+__END__
diff --git a/challenge-078/abigail/test.pl b/challenge-078/abigail/test.pl
new file mode 100755
index 0000000000..115e570c62
--- /dev/null
+++ b/challenge-078/abigail/test.pl
@@ -0,0 +1,44 @@
+#!/opt/perl/bin/perl
+
+#
+# Test the solutions. Either call it with the directory name you
+# want to test in, or call it as "../test.pl" from within the directory.
+#
+
+use 5.032;
+
+use strict;
+use warnings;
+no warnings 'syntax';
+
+chdir shift if @ARGV;
+
+use experimental 'signatures';
+
+use Test::More;
+
+my %languages = (
+ Perl => ["/opt/perl/bin/perl" => 'pl'],
+ JavaScript => ["/usr/local/bin/node" => 'js'],
+);
+
+
+my @inputs = <input*>;
+
+foreach my $language (sort keys %languages) {
+ my ($exe, $ext) = @{$languages {$language}};
+ next unless -r "solution.$ext";
+ subtest $language => sub {
+ foreach my $input (@inputs) {
+ my $output_exp = ($input =~ s/input/output/r) . ".exp";
+ my $exp = `cat $output_exp`;
+ my $got = `$exe ./solution.$ext < $input`;
+ is $got, $exp, $input;
+ }
+ }
+}
+
+done_testing;
+
+
+__END__