diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-03-30 08:42:19 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-30 08:42:19 +0100 |
| commit | a596199e54c68b329e8c1ae3b85f0d2f3b66fbee (patch) | |
| tree | d54c428996c7bfc1a09a8150699586a10614f98b | |
| parent | 1a19630298c8d4c9c06095de34b22c4b1a54b870 (diff) | |
| parent | dbf779fa4833385f8ce465e1570a3af453978efe (diff) | |
| download | perlweeklychallenge-club-a596199e54c68b329e8c1ae3b85f0d2f3b66fbee.tar.gz perlweeklychallenge-club-a596199e54c68b329e8c1ae3b85f0d2f3b66fbee.tar.bz2 perlweeklychallenge-club-a596199e54c68b329e8c1ae3b85f0d2f3b66fbee.zip | |
Merge pull request #3806 from PerlBoy1967/branch-for-challenge-106
Task 1 & 2
| -rwxr-xr-x | challenge-106/perlboy1967/perl/ch-1.pl | 34 | ||||
| -rwxr-xr-x | challenge-106/perlboy1967/perl/ch-2.pl | 69 |
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..45a9fc8c50 --- /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: %d/%d = %s\n", $N, $D, 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) { + $n .= '0'; + $result .= '0' if ($n < $d); + } + + push(@{$rSeen{$n}}, length($result)); + + $result .= int($n/$d) + if (scalar(@{$rSeen{$n}}) < 2); + + $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] -= length($1); + $rSeen{$n}[1] -= length($1); + } + + return sprintf('0.%s(%s)', + substr($result, 0, $rSeen{$n}[0]), + substr($result, $rSeen{$n}[0], + $rSeen{$n}[1] - $rSeen{$n}[0])); +} |
