aboutsummaryrefslogtreecommitdiff
path: root/challenge-048/sol-demuth
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-03-01 22:13:45 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-03-01 22:13:45 +0000
commit42f29cc54292d65a202824fd2ff2efbc922d3be0 (patch)
tree63499b542075c6c1e0fb1549863cdd1746ce3c52 /challenge-048/sol-demuth
parent96209d3fa121f9988e8e7a534ceb1624e4a48fb8 (diff)
downloadperlweeklychallenge-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/README1
-rw-r--r--challenge-048/sol-demuth/perl/ch-2.pl79
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);
+}