diff options
| author | Niels van Dijke <perlboy@cpan.org> | 2021-03-29 21:45:39 +0000 |
|---|---|---|
| committer | Niels van Dijke <perlboy@cpan.org> | 2021-03-29 21:45:39 +0000 |
| commit | cc1ad499d4475bcdaada9bd86bf641ba3ff9e633 (patch) | |
| tree | ca5a5dce8c105ab04eae461787a0b2cf68837199 | |
| parent | 0beed338bde9c2ee3c13c79878d4225103c346e8 (diff) | |
| download | perlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.tar.gz perlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.tar.bz2 perlweeklychallenge-club-cc1ad499d4475bcdaada9bd86bf641ba3ff9e633.zip | |
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..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])); +} |
