aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCY Fung <fungcheokyin@gmail.com>2022-09-25 00:45:24 +0800
committerCY Fung <fungcheokyin@gmail.com>2022-09-25 00:45:24 +0800
commit75ce49b9bb4867c6f439d78e3ff020afab5460ee (patch)
tree1caec016df6a5f0e31670d48a7ffee9e8aef4e8f
parente97bacd5b710e12b8f665df84e297ba3aafde668 (diff)
downloadperlweeklychallenge-club-75ce49b9bb4867c6f439d78e3ff020afab5460ee.tar.gz
perlweeklychallenge-club-75ce49b9bb4867c6f439d78e3ff020afab5460ee.tar.bz2
perlweeklychallenge-club-75ce49b9bb4867c6f439d78e3ff020afab5460ee.zip
Week 183: Task 2 Raku Solution
-rw-r--r--challenge-183/cheok-yin-fung/raku/ch-2.raku99
1 files changed, 99 insertions, 0 deletions
diff --git a/challenge-183/cheok-yin-fung/raku/ch-2.raku b/challenge-183/cheok-yin-fung/raku/ch-2.raku
new file mode 100644
index 0000000000..606bd01255
--- /dev/null
+++ b/challenge-183/cheok-yin-fung/raku/ch-2.raku
@@ -0,0 +1,99 @@
+# The Weekly Challenge 183
+# Task 2 Date Difference
+# Comment: I haven't written and checked
+# the correctness of this script systematically.
+use v6;
+
+multi sub MAIN () {
+ return;
+}
+
+multi sub MAIN (Str $datestamp1, Str $datestamp2) {
+ say date-diff(Date.new($datestamp1), Date.new($datestamp2));
+}
+
+sub date-diff (Date $d1, Date $d2) {
+ return speak-result(diff($d1, $d2));
+}
+
+sub diff (Date $_d1, Date $_d2) {
+ my ($d1, $d2);
+ if ($_d1 < $_d2) {
+ ($d1, $d2) = ($_d2, $_d1);
+ }
+ else {
+ ($d1, $d2) = ($_d1, $_d2);
+ }
+ my %h;
+ %h{'years'} = $d1.year - $d2.year;
+ if ($d1.month==$d2.month && $d1.day-of-month==$d2.day-of-month) {
+ %h{'days'} = 0;
+ }
+ else {
+ %h{'days'} = $d1.day-of-year - $d2.day-of-year;
+ %h{'days'} += 1 if $d2.is-leap-year
+ && $d1.day-of-year > 60
+ && $d2.day-of-year > 60;
+ }
+ if (%h{'days'} < 0) {
+ %h{'years'}--;
+ %h{'days'} += 365;
+ %h{'days'} += 1 if $d2.is-leap-year
+ && $d1.day-of-year < 60
+ && $d2.day-of-year >= 60 ;
+ }
+ return %h;
+}
+
+
+
+sub speak-result (%h) {
+ return %h{'years'}~" years "~ %h{'days'} ~" days"
+ if %h{'years'} > 1 && %h{'days'} > 1 ;
+ return "1 year "~ %h{'days'} ~" days"
+ if %h{'years'} == 1 && %h{'days'} > 1;
+ return %h{'years'}~" years 1 day"
+ if %h{'years'} > 1 && %h{'days'} == 1;
+ return "1 year 1 day"
+ if %h{'years'} == 1 && %h{'days'} == 1;
+ return %h{'years'}~" years"
+ if %h{'years'} > 1 && %h{'days'} == 0;
+ return "1 year"
+ if %h{'years'} == 1 && %h{'days'} == 0;
+ return %h{'days'} ~" days"
+ if %h{'years'} == 0 && %h{'days'} != 1 ;
+ return "1 day"
+ if %h{'years'} == 0 && %h{'days'} == 1;
+}
+
+use Test;
+is( date-diff(Date.new('2019-02-10'), Date.new('2022-11-01')),
+ "3 years 264 days");
+is( date-diff(Date.new('2020-09-15'), Date.new('2022-03-29')),
+ "1 year 195 days");
+is( date-diff(Date.new('2019-12-31'), Date.new('2020-01-01')),
+ "1 day");
+is( date-diff(Date.new('2019-12-01'), Date.new('2019-12-31')),
+ "30 days");
+is( date-diff(Date.new('2019-12-31'), Date.new('2020-12-31')),
+ "1 year");
+is( date-diff(Date.new('2019-12-31'), Date.new('2021-12-31')),
+ "2 years");
+is( date-diff(Date.new('2020-09-15'), Date.new('2021-09-16')),
+ "1 year 1 day");
+is( date-diff(Date.new('2019-09-15'), Date.new('2021-09-16')),
+ "2 years 1 day");
+
+is( date-diff(Date.new('2020-02-29'), Date.new('2019-03-01')),
+ "1 year",
+ "weirdo non-leap year Mar 01 to leap year Feb 29"
+);
+
+is( date-diff(Date.new('2020-03-01'), Date.new('2019-03-01')),
+ "1 year",
+ "non-leap year Mar 01 to leap year Mar 01"
+);
+
+plan 10;
+
+# 2020-02-29 , 2021-02-28 -> 365 days