diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-03-01 22:13:45 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-03-01 22:13:45 +0000 |
| commit | 42f29cc54292d65a202824fd2ff2efbc922d3be0 (patch) | |
| tree | 63499b542075c6c1e0fb1549863cdd1746ce3c52 /challenge-048/sol-demuth | |
| parent | 96209d3fa121f9988e8e7a534ceb1624e4a48fb8 (diff) | |
| download | perlweeklychallenge-club-42f29cc54292d65a202824fd2ff2efbc922d3be0.tar.gz perlweeklychallenge-club-42f29cc54292d65a202824fd2ff2efbc922d3be0.tar.bz2 perlweeklychallenge-club-42f29cc54292d65a202824fd2ff2efbc922d3be0.zip | |
- Added solution by Sol DeMuth.
Diffstat (limited to 'challenge-048/sol-demuth')
| -rw-r--r-- | challenge-048/sol-demuth/README | 1 | ||||
| -rw-r--r-- | challenge-048/sol-demuth/perl/ch-2.pl | 79 |
2 files changed, 80 insertions, 0 deletions
diff --git a/challenge-048/sol-demuth/README b/challenge-048/sol-demuth/README new file mode 100644 index 0000000000..c1899409dc --- /dev/null +++ b/challenge-048/sol-demuth/README @@ -0,0 +1 @@ +Solutions by Sol DeMuth. diff --git a/challenge-048/sol-demuth/perl/ch-2.pl b/challenge-048/sol-demuth/perl/ch-2.pl new file mode 100644 index 0000000000..797229a128 --- /dev/null +++ b/challenge-048/sol-demuth/perl/ch-2.pl @@ -0,0 +1,79 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my $leapDay = '0229'; +my ($minYr, $maxYr) = (2000, 2999); +my @palDates = (); + +my $mm = '01'; +my $dd = '01'; + +while ($mm < 13) { + my $yr = validYear("$mm$dd"); + + if ($yr) { + push @palDates, "$mm$dd$yr"; + } + + incr(\$dd); + + if (monthLength($mm) < $dd) { + # special leap case + if ("$mm$dd" eq $leapDay) { + my $yr = validYear($leapDay); + + if (isLeap($yr)) { + push @palDates, "$leapDay$yr"; + warn "LEAP! $mm$dd$yr\n\n"; + } + } + + # roll monthy/day + incr(\$mm); + $dd = '01'; + } +} + +foreach my $dt (sort { yyyymmdd($a) <=> yyyymmdd($b) } @palDates) { + print $dt . "\n"; +} + +sub incr { # zero-padded increment + ${$_[0]} = sprintf '%02d', ${$_[0]} + 1; +} + +sub isLeap { # doesn't merit datetime + my ($year) = @_; + + return $year && (!($year % 4) && (!!($year % 100) || !($year % 400))); +} + +sub monthLength { # nucks (we don't need datetime...) + my $mm = sprintf '%02d', $_[0]; + my $moLen = 31; + + if ($mm == 2) { + $moLen = 28; + } elsif ($mm =~ /^(?:04|06|09|11)$/) { + $moLen = 30; + } + + return $moLen; +} + +sub validYear { # palindrome test + my $yr = join('', reverse split('', $_[0])); + + if ( + $yr >= $minYr + && $yr <= $maxYr + ) { + return $yr; + } +} + +sub yyyymmdd { # for sorting output + return substr($_[0], 4, 4) . substr($_[0], 0, 4); +} |
