aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels van Dijke <perlboy@cpan.org>2021-03-29 21:45:39 +0000
committerNiels van Dijke <perlboy@cpan.org>2021-03-29 21:45:39 +0000
commitcc1ad499d4475bcdaada9bd86bf641ba3ff9e633 (patch)
treeca5a5dce8c105ab04eae461787a0b2cf68837199
parent0beed338bde9c2ee3c13c79878d4225103c346e8 (diff)
downloadperlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.tar.gz
perlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.tar.bz2
perlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.zip
Task 1 & 2
-rwxr-xr-xchallenge-106/perlboy1967/perl/ch-1.pl34
-rwxr-xr-xchallenge-106/perlboy1967/perl/ch-2.pl69
2 files changed, 103 insertions, 0 deletions
diff --git a/challenge-106/perlboy1967/perl/ch-1.pl b/challenge-106/perlboy1967/perl/ch-1.pl
new file mode 100755
index 0000000000..02b880e6a2
--- /dev/null
+++ b/challenge-106/perlboy1967/perl/ch-1.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 106
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-106/#TASK1
+#
+# Task 1 - Maximum Gap
+#
+# Author: Niels 'PerlBoy' van Dijke
+#
+
+use v5.16;
+use strict;
+use warnings;
+
+use List::Util qw(max);
+use List::MoreUtils qw(pairwise);
+
+@ARGV = (2,4,5,7,9,8,-1,20,11,-15,33,11,10)
+ unless scalar(grep /^[-]*\d+$/, @ARGV) >= 2;
+
+# Silently ignore all non-integer values
+my @N = grep /^[-]*\d+$/, @ARGV;
+
+printf "Input: \@N = (%s)\n", join(',', @N);
+printf "Output: %d\n", maxGap(@N);
+
+sub maxGap {
+ my @i = sort { $a <=> $b } @_;
+
+ my @p1 = @i[0 .. scalar(@i)-2];
+ my @p2 = @i[1 .. scalar(@i)-1];
+
+ return max(pairwise { $b - $a } @p1, @p2);
+}
diff --git a/challenge-106/perlboy1967/perl/ch-2.pl b/challenge-106/perlboy1967/perl/ch-2.pl
new file mode 100755
index 0000000000..b8f71d2a6c
--- /dev/null
+++ b/challenge-106/perlboy1967/perl/ch-2.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 106
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-106/#TASK2
+#
+# Task 1 - Decimal String
+#
+# Author: Niels 'PerlBoy' van Dijke
+#
+# See: https://en.wikipedia.org/wiki/Repeating_decimal
+
+use v5.16;
+use strict;
+use warnings;
+
+@ARGV = (1, 46)
+ unless scalar(@ARGV) >= 2;
+
+my ($N, $D) = @ARGV;
+
+die "\$N must be smaller than \$D ($D, $N)"
+ unless ($N < $D);
+
+printf "Input: \$N = %d, \$D = %d\n", $N, $D;
+printf "Output: %s\n", decimalString($N, $D);
+
+
+sub decimalString {
+ my ($n, $d) = @_;
+
+ my $result = '';
+
+ my %rSeen;
+ my $r = $n;
+
+ # Let's do a 'long div' and track if the
+ # remainder becomes zero or if we've seen
+ # a numerator before
+
+ do {
+ $n = $r;
+
+ while ($n < $d and int($n/$d) < 1) {
+ $n .= '0';
+ $result .= '0' if (int($n/$d) < 1);
+ }
+
+ push(@{$rSeen{$n}}, length($result));
+
+ $result .= int($n/$d)
+ unless (scalar(@{$rSeen{$n}}) > 1);
+
+ $r = $n % $d;
+
+ } while ($r != 0 and scalar(@{$rSeen{$n}} < 2));
+
+ # Non repetitative division?
+ return "0.$result" if ($r == 0);
+
+ if ($result =~ m#0$#) {
+ $rSeen{$n}[0]--;
+ $rSeen{$n}[1]--;
+ }
+
+ return sprintf('0.%s(%s)',
+ substr($result, 0, $rSeen{$n}[0]),
+ substr($result, $rSeen{$n}[0],
+ $rSeen{$n}[1] - $rSeen{$n}[0]));
+}