aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCY Fung <fungcheokyin@gmail.com>2022-07-27 22:57:34 +0800
committerCY Fung <fungcheokyin@gmail.com>2022-07-27 22:57:34 +0800
commit80b8794991b3d7be4b3a761a93efa284f12180ad (patch)
tree3f2d1f397594c44f6426c03f3c9bae3c93ac4aab
parentac8babe1d15abbfd90a57765b47da04d42f1051f (diff)
downloadperlweeklychallenge-club-80b8794991b3d7be4b3a761a93efa284f12180ad.tar.gz
perlweeklychallenge-club-80b8794991b3d7be4b3a761a93efa284f12180ad.tar.bz2
perlweeklychallenge-club-80b8794991b3d7be4b3a761a93efa284f12180ad.zip
Perl Solutions - Week 175
-rw-r--r--challenge-175/cheok-yin-fung/perl/ch-1.pl52
-rw-r--r--challenge-175/cheok-yin-fung/perl/ch-2.pl19
2 files changed, 71 insertions, 0 deletions
diff --git a/challenge-175/cheok-yin-fung/perl/ch-1.pl b/challenge-175/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..ad5bdbb525
--- /dev/null
+++ b/challenge-175/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,52 @@
+# The Weekly Challenge 175
+# Task 1 Last Sunday
+use v5.30.0;
+use Time::Local qw'timegm_nocheck';
+use Time::gmtime;
+
+
+say join "\n", last_sun_year($ARGV[0] || 2022)->@*;
+
+
+sub last_sun_month {
+ my ($m, $y)= @_;
+ my $n = gmtime timegm_nocheck 0, 0, 0, 1, $m+1, $y;
+ my $constant = $n->wday() == 0 ? 7 : $n->wday();
+ return (gmtime timegm_nocheck 0, 0, 0, 1-$constant, $m+1, $y);
+}
+
+
+
+sub date_str {
+ my $d_s = $_[0];
+ return
+ ($d_s->year()+1900)."-"
+ .($d_s->mon()<=8 ? 0 : "").($d_s->mon()+1)."-"
+ .($d_s->mday()<10 ? 0 : "").($d_s->mday())
+}
+
+
+
+sub last_sun_year {
+ my $y = $_[0]-1900;
+ my @suns = map {last_sun_month($_, $y)} (0..10);
+ return [map {date_str $_} @suns, last_sun_month(-1, $y+1)];
+}
+
+
+use Test::More tests => 1;
+use Test::Deep;
+cmp_deeply
+ last_sun_year(2022),
+ ["2022-01-30",
+ "2022-02-27",
+ "2022-03-27",
+ "2022-04-24",
+ "2022-05-29",
+ "2022-06-26",
+ "2022-07-31",
+ "2022-08-28",
+ "2022-09-25",
+ "2022-10-30",
+ "2022-11-27",
+ "2022-12-25"];
diff --git a/challenge-175/cheok-yin-fung/perl/ch-2.pl b/challenge-175/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..8096c138bf
--- /dev/null
+++ b/challenge-175/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,19 @@
+# The Weekly Challenge 175
+# Task 2 Perfect Totient Number
+use v5.20.0;
+use Math::Prime::Util qw/euler_phi/;
+
+my $p = 0;
+for (my $n0 = 3; $n0 < 1_000_000_000; $n0 += 2) {
+ my $n = $n0;
+ my $sum = 0;
+ do {
+ $n = euler_phi($n);
+ $sum += $n;
+ } until ($sum > $n0 || $n == 1);
+ if ($sum == $n0) {
+ say $n0;
+ $p++;
+ }
+ last if $p >= ($ARGV[0] || 20);
+}