diff options
| author | CY Fung <fungcheokyin@gmail.com> | 2022-07-26 07:08:17 +0800 |
|---|---|---|
| committer | CY Fung <fungcheokyin@gmail.com> | 2022-07-26 07:08:17 +0800 |
| commit | 76a86b07067dfe7e15951e264f0c4398e34bc618 (patch) | |
| tree | 34d87608428a900add2474db4ed1ae0eba6c7d71 | |
| parent | 57bfe0772b99880652ca06b9914ad55fee405749 (diff) | |
| download | perlweeklychallenge-club-76a86b07067dfe7e15951e264f0c4398e34bc618.tar.gz perlweeklychallenge-club-76a86b07067dfe7e15951e264f0c4398e34bc618.tar.bz2 perlweeklychallenge-club-76a86b07067dfe7e15951e264f0c4398e34bc618.zip | |
Raku solutions (Week 175)
| -rw-r--r-- | challenge-175/cheok-yin-fung/raku/ch-1.raku | 46 | ||||
| -rw-r--r-- | challenge-175/cheok-yin-fung/raku/ch-2.raku | 39 |
2 files changed, 85 insertions, 0 deletions
diff --git a/challenge-175/cheok-yin-fung/raku/ch-1.raku b/challenge-175/cheok-yin-fung/raku/ch-1.raku new file mode 100644 index 0000000000..f73acba086 --- /dev/null +++ b/challenge-175/cheok-yin-fung/raku/ch-1.raku @@ -0,0 +1,46 @@ +# The Weekly Challenge 175 +# Task 1 Last Sunday +use v6; +use Test; + + +sub lastsun ($s) { + return $s.earlier(days => $s.day-of-week == 0 ?? 7 !! $s.day-of-week ); +} + + + +sub last_sun_year ($year) { + my @ans; + for (2..12) { + my $m = $_ < 10 ?? '0'~"$_" !! $_; + my $s = Date.new("2022-$m-01"); + my $n = lastsun $s; + @ans.push($n); + } + my $ny = Date.new("{$year+1}-01-01"); + my $n = $ny.earlier(days => $ny.day-of-week); + @ans.push($n); + return @ans; +} + + + +is( 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"] +); + +plan 1; + +done-testing; diff --git a/challenge-175/cheok-yin-fung/raku/ch-2.raku b/challenge-175/cheok-yin-fung/raku/ch-2.raku new file mode 100644 index 0000000000..50ff1cd650 --- /dev/null +++ b/challenge-175/cheok-yin-fung/raku/ch-2.raku @@ -0,0 +1,39 @@ +# The Weekly Challenge 175 +# Task 2 Perfect Totient Number +# (benchmark: real 0m36.228s user 0m34.853s sys 0m1.584s) +use v6; +use Prime::Factor; + + +sub totient ($n) { + my $x = 1; + my @s = prime-factors($n).unique; + for (2..$n-1) { + $x++; + for (@s) -> $i { + if ($_ % $i == 0) { + $x--; + last; + } + } + } + return $x; +} + + + +my $p = 0; +loop (my $n0 = 3; $n0 < 1_000_000_000; $n0 += 2 ) { + my $n = $n0; + my $sum = 0; + repeat { + $n = totient($n); + $sum += $n; + } until ($sum > $n0 || $n == 1); + if ($sum == $n0) { + say $n0; + $p++; + } + last if $p >= 20; +} + |
