diff options
| author | E7-87-83 <fungcheokyin@gmail.com> | 2021-11-14 09:59:18 +0800 |
|---|---|---|
| committer | E7-87-83 <fungcheokyin@gmail.com> | 2021-11-14 09:59:18 +0800 |
| commit | ed0f1f1c40bc9491497b091456ad8f1c35c47805 (patch) | |
| tree | b813df851cbe5b2b633d93a8135507a4e81164b2 | |
| parent | aae8862469f431e7c08dc668961cc7a4fe1e4593 (diff) | |
| download | perlweeklychallenge-club-ed0f1f1c40bc9491497b091456ad8f1c35c47805.tar.gz perlweeklychallenge-club-ed0f1f1c40bc9491497b091456ad8f1c35c47805.tar.bz2 perlweeklychallenge-club-ed0f1f1c40bc9491497b091456ad8f1c35c47805.zip | |
tasks of calendar dates
| -rw-r--r-- | challenge-132/cheok-yin-fung/perl/ch-1.pl | 26 | ||||
| -rw-r--r-- | challenge-137/cheok-yin-fung/perl/ch-1.pl | 23 | ||||
| -rw-r--r-- | challenge-138/cheok-yin-fung/BLOG.txt (renamed from challenge-138/BLOG.txt) | 0 | ||||
| -rw-r--r-- | challenge-138/cheok-yin-fung/java/WorkDays.java (renamed from challenge-138/java/WorkDays.java) | 0 | ||||
| -rw-r--r-- | challenge-138/cheok-yin-fung/julia/ch-1.jl (renamed from challenge-138/julia/ch-1.jl) | 4 | ||||
| -rw-r--r-- | challenge-138/cheok-yin-fung/perl/ch-1.pl (renamed from challenge-138/perl/ch-1.pl) | 62 | ||||
| -rw-r--r-- | challenge-138/cheok-yin-fung/perl/ch-2.pl (renamed from challenge-138/perl/ch-2.pl) | 0 |
7 files changed, 48 insertions, 67 deletions
diff --git a/challenge-132/cheok-yin-fung/perl/ch-1.pl b/challenge-132/cheok-yin-fung/perl/ch-1.pl index 0247cfb9db..3dd745440b 100644 --- a/challenge-132/cheok-yin-fung/perl/ch-1.pl +++ b/challenge-132/cheok-yin-fung/perl/ch-1.pl @@ -2,22 +2,24 @@ # The Weekly Challenge 132 # Task 1 Mirror Dates # Usage: ch-1.pl YYYY/MM/DD +# modified: 14th Nov 2021 use v5.24.0; use warnings; -use Time::Local qw'timelocal timegm_nocheck'; +use Time::Local qw'timegm_nocheck'; +use Time::gmtime; use Test::More tests => 3; say mirror_str($ARGV[0]) if defined($ARGV[0]); sub mirror { my @arr_today = (22, 8, 2021); # Wed Sep 22 2021 - my $_today = timelocal(0, 0, 0, @arr_today); + my $_today = timegm_nocheck(0, 0, 0, @arr_today); my @arr_birth = ($_[2], $_[1]-1, $_[0]); - my $_birth = timelocal(0, 0, 0, @arr_birth); + my $_birth = timegm_nocheck(0, 0, 0, @arr_birth); my $y1 = int (($_today - $_birth)/86400); - my @d_senior = localtime timegm_nocheck 0, 0, 0, $arr_birth[0]-$y1, $arr_birth[1], $arr_birth[2]; - my @d_junior = localtime timegm_nocheck 0, 0, 0, $arr_today[0]+$y1, $arr_today[1], $arr_today[2]; - return [ [@d_senior], [@d_junior] ]; + my $d_senior = gmtime timegm_nocheck 0, 0, 0, $arr_birth[0]-$y1, $arr_birth[1], $arr_birth[2]; + my $d_junior = gmtime timegm_nocheck 0, 0, 0, $arr_today[0]+$y1, $arr_today[1], $arr_today[2]; + return [ $d_senior, $d_junior ]; } sub mirror_str { @@ -27,13 +29,13 @@ sub mirror_str { my ($d_s, $d_j) = mirror($byear, $bmonth, $bday)->@*; return - ($d_s->[5]+1900)."/" - .($d_s->[4]<=8 ? 0 : "").($d_s->[4]+1)."/" - .($d_s->[3]<10 ? 0 : "").($d_s->[3]) + ($d_s->year()+1900)."/" + .($d_s->mon()<=8 ? 0 : "").($d_s->mon()+1)."/" + .($d_s->mday()<10 ? 0 : "").($d_s->mday()) .", " - .($d_j->[5]+1900)."/" - .($d_j->[4]<=8 ? 0 : "").($d_j->[4]+1)."/" - .($d_j->[3]<10 ? 0 : "").($d_j->[3]); + .($d_j->year()+1900)."/" + .($d_j->mon()<=8 ? 0 : "").($d_j->mon()+1)."/" + .($d_j->mday()<10 ? 0 : "").($d_j->mday()); } ok mirror_str("2021/09/18") eq "2021/09/14, 2021/09/26", "Example 1"; diff --git a/challenge-137/cheok-yin-fung/perl/ch-1.pl b/challenge-137/cheok-yin-fung/perl/ch-1.pl index 7324e71726..b64b9cf27a 100644 --- a/challenge-137/cheok-yin-fung/perl/ch-1.pl +++ b/challenge-137/cheok-yin-fung/perl/ch-1.pl @@ -2,31 +2,26 @@ # The Weekly Challenge 137 # Task 1 Long Year # Usage: ch-1.pl +# modified: 14th Nov 2021 use v5.12.0; use warnings; +use Time::gmtime; use Time::Local qw 'timegm_nocheck'; + my $c = 0; + for my $y (1900..2100) { - my %wday = ( - "Mon" => 1, - "Tue" => 2, - "Wed" => 3, - "Thu" => 4, - "Fri" => 5, - "Sat" => 6, - "Sun" => 7, - ); - my $fourthJan = localtime timegm_nocheck 0, 0, 0, 4, 0, $y; + my $fourthJan = gmtime timegm_nocheck 0, 0, 0, 4, 0, $y; - my $a = $wday{(split " ", $fourthJan)[0]}; + my $a = $fourthJan->wday(); - my $yearLastDay = localtime timegm_nocheck 0, 0, 0, 31, 11, $y; + my $yearLastDay = gmtime timegm_nocheck 0, 0, 0, 31, 11, $y; - my $b = $wday{(split " ", $yearLastDay)[0]}; + my $b = $yearLastDay->wday(); - if ($a >= 4 && $b >= 4) { + if (($a >= 4 || $a == 0) && ($b >= 4 || $b == 0)) { say $y; $c++; } diff --git a/challenge-138/BLOG.txt b/challenge-138/cheok-yin-fung/BLOG.txt index 470d7b5ebf..470d7b5ebf 100644 --- a/challenge-138/BLOG.txt +++ b/challenge-138/cheok-yin-fung/BLOG.txt diff --git a/challenge-138/java/WorkDays.java b/challenge-138/cheok-yin-fung/java/WorkDays.java index 8d98f71adf..8d98f71adf 100644 --- a/challenge-138/java/WorkDays.java +++ b/challenge-138/cheok-yin-fung/java/WorkDays.java diff --git a/challenge-138/julia/ch-1.jl b/challenge-138/cheok-yin-fung/julia/ch-1.jl index edd6a62b7f..488840e21b 100644 --- a/challenge-138/julia/ch-1.jl +++ b/challenge-138/cheok-yin-fung/julia/ch-1.jl @@ -32,8 +32,7 @@ function num_of_work_days(year) LastMondayDec = SundayDec + Dates.Day(1); - ans += 5*(dayofyear(LastMondayDec) - dayofyear(FirstMondayJan))/7 - # early version of CY's code: ans += 5*51 + ans += 5*(Dates.dayofyear(LastMondayDec) - Dates.dayofyear(FirstMondayJan))/7 ans = convert(Int64, ans) my_day = LastMondayDec @@ -45,7 +44,6 @@ function num_of_work_days(year) end return ans - end diff --git a/challenge-138/perl/ch-1.pl b/challenge-138/cheok-yin-fung/perl/ch-1.pl index bb3e5fd167..e546af3bab 100644 --- a/challenge-138/perl/ch-1.pl +++ b/challenge-138/cheok-yin-fung/perl/ch-1.pl @@ -5,6 +5,7 @@ use v5.12.0; use warnings; use Time::Local qw 'timelocal_nocheck '; +use Time::localtime; use Time::HiRes qw 'time'; #for benchmarking say count_work_days($ARGV[0]) if defined($ARGV[0]) && $ARGV[0] >= 1900; @@ -17,7 +18,7 @@ benchmark(); sub testing { for my $i (1975..2400) { - say "big event in ", $i + say "big event in ", $i , "\n" if simple_days_count($i) != count_work_days($i); } } @@ -26,72 +27,51 @@ sub testing { sub count_work_days { my $y = $_[0]; - my %wday = ( - "Mon" => 1, - "Tue" => 2, - "Wed" => 3, - "Thu" => 4, - "Fri" => 5, - "Sat" => 6, - "Sun" => 0, - ); my $_01Jan = localtime timelocal_nocheck 0, 0, 0, 1, 0, $y; - my $d_01Jan= $wday{(split " ", $_01Jan)[0]}; - + my $d_01Jan = $_01Jan->wday(); my $diff = (1 - $d_01Jan) % 7; - my @firstMonday = localtime timelocal_nocheck 0, 0, 0, 1+$diff, 0, $y; + my $firstMonday = timelocal_nocheck 0, 0, 0, 1+$diff, 0, $y; my $_31Dec = localtime timelocal_nocheck 0, 0, 0, 31, 11, $y; - my $d_31Dec = $wday{(split " ", $_31Dec)[0]}; + my $d_31Dec = $_31Dec->wday(); my $back_diff = ($d_31Dec - 5) % 7; - my @MondayAfterLastFriday -# = $back_diff < 3 -# ? localtime timelocal_nocheck 0, 0, 0, 3-$back_diff, 0, $y+1 -# : localtime timelocal_nocheck 0, 0, 0, 31-$back_diff+3, 11, $y; - = localtime timelocal_nocheck 0, 0, 0, 3-$back_diff, 0, $y+1; + my $MondayAfterLastFriday + = timelocal_nocheck 0, 0, 0, 3-$back_diff, 0, $y+1; my $ans = 5 * int ( - (timelocal_nocheck(@MondayAfterLastFriday) - -timelocal_nocheck(@firstMonday)) + ($MondayAfterLastFriday + -$firstMonday) /86400/7 ); + $ans += 6-$d_01Jan if $d_01Jan > 1; $ans += $d_31Dec if $d_31Dec < 5; return $ans; - } + + sub simple_days_count { - my %wday = ( - "Mon" => 1, - "Tue" => 2, - "Wed" => 3, - "Thu" => 4, - "Fri" => 5, - "Sat" => 6, - "Sun" => 0, - ); my $y = $_[0]; my $day_var = timelocal_nocheck 0, 0, 0, 1, 0, $y; - my $my_day = scalar localtime $day_var; - - my $d = $wday{(split " ", $my_day)[0]}; + my $my_day = localtime $day_var; + my $d = $my_day->wday(); my $i = 0; - while ((split " ", $my_day)[4] == $y) { + while ( ($my_day->year()+1900) == $y) { $i++ if ($d >= 1 && $d <= 5); $day_var = $day_var + 86400; - $my_day = scalar localtime $day_var; - $d = $wday{(split " ", $my_day)[0]}; + $my_day = localtime $day_var; + $d = $my_day->wday(); } return $i; } @@ -99,6 +79,7 @@ sub simple_days_count { sub benchmark { + my $time_0 = time; for my $i (1975..2400) { simple_days_count($i); @@ -115,8 +96,13 @@ sub benchmark { say "simple_days_count: ", $time_1 - $time_0; say "count_work_days: ", $time_2 - $time_1; - # Output: + # Output, before using Time::localtime # simple_days_count: 0.491244077682495 # count_work_days: 0.0362129211425781 + + # Output, after using Time::localtime + # simple_days_count: 1.16461586952209 + # count_work_days: 0.0263321399688721 } + diff --git a/challenge-138/perl/ch-2.pl b/challenge-138/cheok-yin-fung/perl/ch-2.pl index 3cf1916ec2..3cf1916ec2 100644 --- a/challenge-138/perl/ch-2.pl +++ b/challenge-138/cheok-yin-fung/perl/ch-2.pl |
