aboutsummaryrefslogtreecommitdiff
path: root/challenge-013
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2019-06-19 11:31:11 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2019-06-19 11:31:11 +0100
commit4f3deee0773ee5d5c2c3832278cf4bb0a33c7a57 (patch)
treebc5788cb5b737acd7dcdfa8a61299c8070690ab0 /challenge-013
parent8dcfe60d2313bc33f22471d54143d878a850539a (diff)
downloadperlweeklychallenge-club-4f3deee0773ee5d5c2c3832278cf4bb0a33c7a57.tar.gz
perlweeklychallenge-club-4f3deee0773ee5d5c2c3832278cf4bb0a33c7a57.tar.bz2
perlweeklychallenge-club-4f3deee0773ee5d5c2c3832278cf4bb0a33c7a57.zip
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-013')
-rw-r--r--challenge-013/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-013/laurent-rosenfeld/perl5/ch-1.pl19
-rw-r--r--challenge-013/laurent-rosenfeld/perl5/ch-1a.pl26
-rw-r--r--challenge-013/laurent-rosenfeld/perl5/ch-2.pl21
-rw-r--r--challenge-013/laurent-rosenfeld/perl5/ch-2a.pl21
-rw-r--r--challenge-013/laurent-rosenfeld/perl6/ch-1.p619
-rw-r--r--challenge-013/laurent-rosenfeld/perl6/ch-2.p615
-rw-r--r--challenge-013/laurent-rosenfeld/perl6/ch-2a.p615
8 files changed, 137 insertions, 0 deletions
diff --git a/challenge-013/laurent-rosenfeld/blog.txt b/challenge-013/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..6aefa9f2cb
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2019/06/perl-weekly-challenge-13-fridays-and-mutually-recursive-subroutines.html
diff --git a/challenge-013/laurent-rosenfeld/perl5/ch-1.pl b/challenge-013/laurent-rosenfeld/perl5/ch-1.pl
new file mode 100644
index 0000000000..a6dc05c549
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl5/ch-1.pl
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature "say";
+use Time::Local qw/timegm_nocheck/ ;
+
+
+my $year = shift // 2019;
+for my $month (0..11) {
+ my @last_friday;
+ for my $day (20..31) {
+ my $epoch =
+ timegm_nocheck(0, 0, 12, $day, $month, $year - 1900);
+ my @date_details = gmtime $epoch;
+ last if $date_details[3] != $day;
+ @last_friday = @date_details if $date_details[6] == 5;
+ }
+ printf "%d/%02d/%d\n", $year, $month + 1, $last_friday[3];
+}
diff --git a/challenge-013/laurent-rosenfeld/perl5/ch-1a.pl b/challenge-013/laurent-rosenfeld/perl5/ch-1a.pl
new file mode 100644
index 0000000000..e4795b3c6e
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl5/ch-1a.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature "say";
+use Time::Local;
+
+sub is_leap_year {
+ my $year = shift;
+ return $year % 4 == 0; # works for years between 1901 and 2099
+}
+
+my @month_lengths = qw/ 31 28 31 30 31 30 31 31 30 31 30 31/;
+my $year = shift // 2019;
+
+for my $month (0..11) {
+ my $month_length = $month_lengths[$month];
+ $month_length = 29 if $month == 1
+ and is_leap_year $year; # Feb is 1
+ my @last_friday;
+ for my $day (20..$month_length) {
+ my $epoch = timegm(0, 0, 12, $day, $month, $year - 1900);
+ my @date_details = gmtime $epoch;
+ @last_friday = @date_details if $date_details[6] == 5;
+ }
+ printf "%d/%02d/%d\n", $year, $month + 1, $last_friday[3];
+}
diff --git a/challenge-013/laurent-rosenfeld/perl5/ch-2.pl b/challenge-013/laurent-rosenfeld/perl5/ch-2.pl
new file mode 100644
index 0000000000..5b67ade8ed
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl5/ch-2.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature "say";
+
+sub female {
+ my $n = shift;
+ return 1 if $n == 0; # base case
+ return $n - male (female ($n - 1));
+}
+sub male {
+ my $n = shift;
+ return 0 if $n == 0; #base case
+ return $n - female (male ($n - 1));
+}
+say "Female sequence: ";
+printf "%d ", female $_ for 0..30;
+say "";
+say "Male sequence:";
+printf "%d ", male $_ for 0..30;
+say "";
diff --git a/challenge-013/laurent-rosenfeld/perl5/ch-2a.pl b/challenge-013/laurent-rosenfeld/perl5/ch-2a.pl
new file mode 100644
index 0000000000..a54ca1c19d
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl5/ch-2a.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature "say";
+no warnings "recursion";
+use Memoize;
+
+memoize('female', 'male');
+
+sub female {
+ my $n = shift;
+ return 1 if $n == 0; # base case
+ return $n - male (female ($n - 1));
+}
+sub male {
+ my $n = shift;
+ return 0 if $n == 0; #base case
+ return $n - female (male ($n - 1));
+}
+say "Female sequence: ";
+say female shift;
diff --git a/challenge-013/laurent-rosenfeld/perl6/ch-1.p6 b/challenge-013/laurent-rosenfeld/perl6/ch-1.p6
new file mode 100644
index 0000000000..82ed14d21a
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl6/ch-1.p6
@@ -0,0 +1,19 @@
+use v6;
+
+sub MAIN (UInt $year = 2019) {
+ my $year-length =
+ DateTime.new(:year($year)).is-leap-year ?? 366 !! 365;
+ my $day = Date.new("$year-01-01");
+ my $month = 1;
+ my $last-friday;
+ for 1..$year-length {
+ $day = $day.succ;
+ next unless $day.day-of-week == 5;
+ if $day.month != $month {
+ $month = $day.month;
+ say $last-friday;
+ }
+ $last-friday = $day;
+ }
+ say $last-friday;
+}
diff --git a/challenge-013/laurent-rosenfeld/perl6/ch-2.p6 b/challenge-013/laurent-rosenfeld/perl6/ch-2.p6
new file mode 100644
index 0000000000..9a107feeec
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl6/ch-2.p6
@@ -0,0 +1,15 @@
+use v6;
+
+sub female (UInt:D $n) {
+ return 1 if $n == 0; # base case
+ return $n - male (female ($n - 1));
+}
+sub male (UInt:D $n) {
+ return 0 if $n == 0; #base case
+ return $n - female (male ($n - 1));
+}
+say "Female sequence:";
+printf "%d ", female $_ for 0..30;
+say "";
+say "Male sequence:";
+printf "%d ", male $_ for 0..30;
diff --git a/challenge-013/laurent-rosenfeld/perl6/ch-2a.p6 b/challenge-013/laurent-rosenfeld/perl6/ch-2a.p6
new file mode 100644
index 0000000000..3bebf1379b
--- /dev/null
+++ b/challenge-013/laurent-rosenfeld/perl6/ch-2a.p6
@@ -0,0 +1,15 @@
+use v6;
+
+multi sub female (0) { 1; } # base case
+multi sub female (UInt:D $n) {
+ return $n - male (female ($n - 1));
+}
+multi sub male (0) { 0; } # base case
+multi sub male (UInt:D $n) {
+ return $n - female (male ($n - 1));
+}
+say "Female sequence:";
+printf "%d ", female $_ for 0..30;
+say "";
+say "Male sequence:";
+printf "%d ", male $_ for 0..30;