diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-12-08 10:59:42 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-12-08 10:59:42 +0000 |
| commit | 8271fcf23a3c9ff9df501c607c96a2c1bb1ab10a (patch) | |
| tree | 56447e0d5a097c4f66082d7cbebb4f8c9efe5e99 /challenge-037 | |
| parent | 1bc39b559acfabc89a8baacda6c665a0329a52fb (diff) | |
| download | perlweeklychallenge-club-8271fcf23a3c9ff9df501c607c96a2c1bb1ab10a.tar.gz perlweeklychallenge-club-8271fcf23a3c9ff9df501c607c96a2c1bb1ab10a.tar.bz2 perlweeklychallenge-club-8271fcf23a3c9ff9df501c607c96a2c1bb1ab10a.zip | |
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-037')
| -rw-r--r-- | challenge-037/laurent-rosenfeld/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl5/ch-1.pl | 28 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl5/ch-2.pl | 107 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl6/ch-1.p6 | 12 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl6/ch-1a.sh | 1 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl6/ch-2.p6 | 17 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl6/december_2019.txt | 31 | ||||
| -rw-r--r-- | challenge-037/laurent-rosenfeld/perl6/november_2019.txt | 30 |
8 files changed, 227 insertions, 0 deletions
diff --git a/challenge-037/laurent-rosenfeld/blog.txt b/challenge-037/laurent-rosenfeld/blog.txt new file mode 100644 index 0000000000..91646f4cf1 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/blog.txt @@ -0,0 +1 @@ +http://blogs.perl.org/users/laurent_r/2019/12/perl-weekly-challenge-37-week-days-in-each-month-and-daylight-gainloss.html diff --git a/challenge-037/laurent-rosenfeld/perl5/ch-1.pl b/challenge-037/laurent-rosenfeld/perl5/ch-1.pl new file mode 100644 index 0000000000..a8f2af2082 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl5/ch-1.pl @@ -0,0 +1,28 @@ +#!/usr/bin/perl +use strict; +use warnings; +use feature qw/say/; +use Time::Local; + +my $yr = shift // 2019; +my @months = (0, 31, is_leap($yr) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); +my $start_date = timegm( 0, 0, 0, 1, 0, $yr - 1900 ); # Jan 1st +my $day_in_week = (gmtime $start_date)[6]; + +for my $month (1..12) { + my $weekdays = 20; + for my $day (29..$months[$month]) { + $weekdays ++ unless $day_in_week =~ /[607]/; + $day_in_week ++; + } + printf "%02d/%d has $weekdays week days.\n", $month, $yr; + $day_in_week -= 7 if $day_in_week > 6; +} + +sub is_leap { + my $yr = shift; + return 0 if $yr % 4; # no if not divisible by 4 + return 1 if $yr % 100; # yes if divisible by 4 but not by 100 + return 0 if $yr % 400; # no if divisible by 100 and not by 400 + return 1; # yes if divisibe by 400 +} diff --git a/challenge-037/laurent-rosenfeld/perl5/ch-2.pl b/challenge-037/laurent-rosenfeld/perl5/ch-2.pl new file mode 100644 index 0000000000..7c78c81c0d --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl5/ch-2.pl @@ -0,0 +1,107 @@ +#!/usr/bin/perl +use strict; +use warnings; +use feature qw/say/; + +sub hrs2sec { + my ($hrs, $min, $sec) = split /:/, shift; + return $hrs * 3600 + $min * 60 + $sec; +} +sub sec2hrs { + my $sec = shift; + my $hrs = int $sec / 3600; + $sec = $sec % 3600; + my $min = int $sec / 60; + $sec = $sec % 60; + return sprintf "$hrs:%02d:%02d", $min, $sec; +} +my (@nov, @dec); +my $aref = \@nov; +while (<DATA>) { + chomp; + $aref = \@dec if /^Dec/; + next unless /^\d/; + my ($date, $duration) = (split /\s+/)[0, 3]; + $aref->[$date] = hrs2sec $duration; +} +my $total_diff; +say "Daylight change between:"; +for my $i (1..30) { + my $diff = $dec[$i] - $nov[$i]; + $total_diff += $diff; + my $dif_hrs = sec2hrs abs $diff; + $dif_hrs = "- $dif_hrs" if $diff < 0; + printf "%02d Nov and %02d Dec: $dif_hrs\n", $i, $i; +} +say "Average change between Nov and Dec: ", $total_diff < 0 ? "- " : "", sec2hrs (abs $total_diff / 30); + +__DATA__ + + Sunrise Sunset Length + +Nov 2019 + +1 06h53 16h34 9:40:44 +2 06h55 16h32 9:37:10 +3 06h56 16h30 9:33:37 +4 06h58 16h28 9:30:07 +5 07h00 16h27 9:26:38 +6 07h02 16h25 9:23:11 +7 07h03 16h23 9:19:45 +8 07h05 16h22 9:16:22 +9 07h07 16h20 9:13:01 +10 07h09 16h18 9:09:42 +11 07h10 16h17 9:06:25 +12 07h12 16h15 9:03:11 +13 07h14 16h14 8:59:59 +14 07h16 16h12 8:56:50 +15 07h17 16h11 8:53:44 +16 07h19 16h10 8:50:40 +17 07h21 16h08 8:47:39 +18 07h22 16h07 8:44:42 +19 07h24 16h06 8:41:48 +20 07h26 16h05 8:38:57 +21 07h27 16h04 8:36:09 +22 07h29 16h03 8:33:25 +23 07h31 16h01 8:30:45 +24 07h32 16h00 8:28:09 +25 07h34 15h59 8:25:36 +26 07h35 15h59 8:23:08 +27 07h37 15h58 8:20:44 +28 07h38 15h57 8:18:24 +29 07h40 15h56 8:16:09 +30 07h41 15h55 8:13:59 + +Dec 2019 + +1 07h43 15h55 8:11:53 +2 07h44 15h54 8:09:53 +3 07h46 15h53 8:07:57 +4 07h47 15h53 8:06:07 +5 07h48 15h53 8:04:22 +6 07h49 15h52 8:02:42 +7 07h51 15h52 8:01:08 +8 07h52 15h51 7:59:40 +9 07h53 15h51 7:58:17 +10 07h54 15h51 7:57:00 +11 07h55 15h51 7:55:50 +12 07h56 15h51 7:54:45 +13 07h57 15h51 7:53:46 +14 07h58 15h51 7:52:54 +15 07h59 15h51 7:52:07 +16 08h00 15h51 7:51:27 +17 08h00 15h51 7:50:54 +18 08h01 15h52 7:50:27 +19 08h02 15h52 7:50:06 +20 08h02 15h52 7:49:52 +21 08h03 15h53 7:49:44 +22 08h04 15h53 7:49:43 +23 08h04 15h54 7:49:48 +24 08h04 15h54 7:50:00 +25 08h05 15h55 7:50:19 +26 08h05 15h56 7:50:44 +27 08h05 15h57 7:51:15 +28 08h06 15h57 7:51:53 +29 08h06 15h58 7:52:37 +30 08h06 15h59 7:53:27 +31 08h06 16h00 7:54:24 diff --git a/challenge-037/laurent-rosenfeld/perl6/ch-1.p6 b/challenge-037/laurent-rosenfeld/perl6/ch-1.p6 new file mode 100644 index 0000000000..e713e25ddb --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl6/ch-1.p6 @@ -0,0 +1,12 @@ +use v6; + +sub MAIN (UInt $yr = 2019) { + for 1..12 -> $mth { + my $weekdays = 20; + for 29..Date.new($yr, $mth, 1).days-in-month -> $day { + $weekdays++ if + Date.new($yr, $mth, $day).day-of-week == (1..5).any; + } + printf "%02d/%d has $weekdays week days.\n", $mth, $yr; + } +} diff --git a/challenge-037/laurent-rosenfeld/perl6/ch-1a.sh b/challenge-037/laurent-rosenfeld/perl6/ch-1a.sh new file mode 100644 index 0000000000..cdcc2cd268 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl6/ch-1a.sh @@ -0,0 +1 @@ +perl6 -e 'my @a; for Date.new(2019, 1, 1) .. Date.new(2019, 12, 31) -> $day { @a[$day.month]++ if $day.day-of-week == (1..5).any}; for @a[1..12].kv -> $k, $v {printf "%02d/2019: %d week days\n", $k+1, $v};' diff --git a/challenge-037/laurent-rosenfeld/perl6/ch-2.p6 b/challenge-037/laurent-rosenfeld/perl6/ch-2.p6 new file mode 100644 index 0000000000..8699a3d2e6 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl6/ch-2.p6 @@ -0,0 +1,17 @@ +use v6; +sub hrs2sec ($hms) { + my ($hrs, $min, $sec) = split /\:/, $hms; + return $hrs * 60² + $min * 60 + $sec; +} +sub sec2hrs (Numeric $sec) { + my @duration = $sec.abs.polymod(60, 60); + my $fmt = ($sec < 0 ?? "-" !! "") ~ "%d:%02d:%02d"; + return sprintf $fmt, @duration[2, 1, 0]; +} + +my @nov = 'november_2019.txt'.IO.lines[0..29].map({(.split(/\s+/))[3]}); +my @dec = 'december_2019.txt'.IO.lines[0..29].map({(.split(/\s+/))[3]}); +my @diff = @dec.map({hrs2sec $_}) Z- @nov.map({hrs2sec $_}); +say "Daylight changes between Dec and Nov:"; +for @diff.kv -> $k, $v { printf "%2d: %s\n", $k + 1, sec2hrs( $v) }; +say "\nAverage change between Nov and Dec: ", sec2hrs ([+] @diff) / 30; diff --git a/challenge-037/laurent-rosenfeld/perl6/december_2019.txt b/challenge-037/laurent-rosenfeld/perl6/december_2019.txt new file mode 100644 index 0000000000..171f239307 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl6/december_2019.txt @@ -0,0 +1,31 @@ +1 07h43 15h55 8:11:53 +2 07h44 15h54 8:09:53 +3 07h46 15h53 8:07:57 +4 07h47 15h53 8:06:07 +5 07h48 15h53 8:04:22 +6 07h49 15h52 8:02:42 +7 07h51 15h52 8:01:08 +8 07h52 15h51 7:59:40 +9 07h53 15h51 7:58:17 +10 07h54 15h51 7:57:00 +11 07h55 15h51 7:55:50 +12 07h56 15h51 7:54:45 +13 07h57 15h51 7:53:46 +14 07h58 15h51 7:52:54 +15 07h59 15h51 7:52:07 +16 08h00 15h51 7:51:27 +17 08h00 15h51 7:50:54 +18 08h01 15h52 7:50:27 +19 08h02 15h52 7:50:06 +20 08h02 15h52 7:49:52 +21 08h03 15h53 7:49:44 +22 08h04 15h53 7:49:43 +23 08h04 15h54 7:49:48 +24 08h04 15h54 7:50:00 +25 08h05 15h55 7:50:19 +26 08h05 15h56 7:50:44 +27 08h05 15h57 7:51:15 +28 08h06 15h57 7:51:53 +29 08h06 15h58 7:52:37 +30 08h06 15h59 7:53:27 +31 08h06 16h00 7:54:24 diff --git a/challenge-037/laurent-rosenfeld/perl6/november_2019.txt b/challenge-037/laurent-rosenfeld/perl6/november_2019.txt new file mode 100644 index 0000000000..c1e5ceeca9 --- /dev/null +++ b/challenge-037/laurent-rosenfeld/perl6/november_2019.txt @@ -0,0 +1,30 @@ +1 06h53 16h34 9:40:44 +2 06h55 16h32 9:37:10 +3 06h56 16h30 9:33:37 +4 06h58 16h28 9:30:07 +5 07h00 16h27 9:26:38 +6 07h02 16h25 9:23:11 +7 07h03 16h23 9:19:45 +8 07h05 16h22 9:16:22 +9 07h07 16h20 9:13:01 +10 07h09 16h18 9:09:42 +11 07h10 16h17 9:06:25 +12 07h12 16h15 9:03:11 +13 07h14 16h14 8:59:59 +14 07h16 16h12 8:56:50 +15 07h17 16h11 8:53:44 +16 07h19 16h10 8:50:40 +17 07h21 16h08 8:47:39 +18 07h22 16h07 8:44:42 +19 07h24 16h06 8:41:48 +20 07h26 16h05 8:38:57 +21 07h27 16h04 8:36:09 +22 07h29 16h03 8:33:25 +23 07h31 16h01 8:30:45 +24 07h32 16h00 8:28:09 +25 07h34 15h59 8:25:36 +26 07h35 15h59 8:23:08 +27 07h37 15h58 8:20:44 +28 07h38 15h57 8:18:24 +29 07h40 15h56 8:16:09 +30 07h41 15h55 8:13:59 |
