From f3f6c363a77db96ffcb01aa7a58348dc95a49560 Mon Sep 17 00:00:00 2001 From: Flavio Poletti Date: Tue, 5 Apr 2022 21:41:55 +0200 Subject: Add polettix's solution to challenge-159 --- challenge-150/polettix/raku/ch-2.raku | 2 +- challenge-159/polettix/blog.txt | 1 + challenge-159/polettix/blog1.txt | 1 + challenge-159/polettix/perl/ch-1.pl | 19 ++++++++++++++ challenge-159/polettix/perl/ch-2.pl | 23 ++++++++++++++++ challenge-159/polettix/perl/cpanfile | 1 - challenge-159/polettix/perl/cpanfile.snapshot | 38 --------------------------- challenge-159/polettix/raku/ch-1.raku | 15 +++++++++++ challenge-159/polettix/raku/ch-2.raku | 18 +++++++++++++ 9 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 challenge-159/polettix/blog.txt create mode 100644 challenge-159/polettix/blog1.txt create mode 100644 challenge-159/polettix/perl/ch-1.pl create mode 100644 challenge-159/polettix/perl/ch-2.pl delete mode 100644 challenge-159/polettix/perl/cpanfile delete mode 100644 challenge-159/polettix/perl/cpanfile.snapshot create mode 100644 challenge-159/polettix/raku/ch-1.raku create mode 100644 challenge-159/polettix/raku/ch-2.raku diff --git a/challenge-150/polettix/raku/ch-2.raku b/challenge-150/polettix/raku/ch-2.raku index 35a29749b0..a7f858a3e1 100644 --- a/challenge-150/polettix/raku/ch-2.raku +++ b/challenge-150/polettix/raku/ch-2.raku @@ -18,7 +18,7 @@ sub is-square-free ($N is copy) { return False if $N %% 4; my $divisor = 3; while $N > $divisor { - if $N %% $divisor == 0 { + if $N %% $divisor { $N = ($N / $divisor).Int; return False if $N %% $divisor; } diff --git a/challenge-159/polettix/blog.txt b/challenge-159/polettix/blog.txt new file mode 100644 index 0000000000..a7d0f36761 --- /dev/null +++ b/challenge-159/polettix/blog.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/04/05/pwc159-farey-sequence/ diff --git a/challenge-159/polettix/blog1.txt b/challenge-159/polettix/blog1.txt new file mode 100644 index 0000000000..98e41e86c3 --- /dev/null +++ b/challenge-159/polettix/blog1.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/04/06/pwc159-moebius-number/ diff --git a/challenge-159/polettix/perl/ch-1.pl b/challenge-159/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..960834ecd9 --- /dev/null +++ b/challenge-159/polettix/perl/ch-1.pl @@ -0,0 +1,19 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +say join ', ', farey_sequence(shift || 4); + +sub farey_sequence ($n) { + my @retval; + my @cache = (0, 1, 1, $n); + while ($cache[2] < $n) { + my $k = int(($n + $cache[1]) / $cache[3]); + push @cache, $k * $cache[2] - $cache[0], $k * $cache[3] - $cache[1]; + push @retval, join '/', splice @cache, 0, 2; + } + push @retval, '1/1'; + return @retval; +} diff --git a/challenge-159/polettix/perl/ch-2.pl b/challenge-159/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..19dea2a0b9 --- /dev/null +++ b/challenge-159/polettix/perl/ch-2.pl @@ -0,0 +1,23 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +say $_, ' ', moebius_number($_) for (@ARGV ? @ARGV : (1 .. 10)); + +sub moebius_number ($n) { + return 0 unless $n % 4; + ($n, my $n_divisors) = $n % 2 ? ($n, 0) : ($n / 2, 1); + my $divisor = 3; + while ($n >= $divisor) { + if ($n % $divisor == 0) { + ++$n_divisors; + $n /= $divisor; + return 0 unless $n % $divisor; + } + $divisor += 2; # go through odd candidates only + } + return 1 - 2 * ($n_divisors % 2); +} + diff --git a/challenge-159/polettix/perl/cpanfile b/challenge-159/polettix/perl/cpanfile deleted file mode 100644 index 91dda9616f..0000000000 --- a/challenge-159/polettix/perl/cpanfile +++ /dev/null @@ -1 +0,0 @@ -requires 'Math::Prime::Util'; diff --git a/challenge-159/polettix/perl/cpanfile.snapshot b/challenge-159/polettix/perl/cpanfile.snapshot deleted file mode 100644 index 2fd600a3af..0000000000 --- a/challenge-159/polettix/perl/cpanfile.snapshot +++ /dev/null @@ -1,38 +0,0 @@ -# carton snapshot format: version 1.0 -DISTRIBUTIONS - Math-Prime-Util-0.73 - pathname: D/DA/DANAJ/Math-Prime-Util-0.73.tar.gz - provides: - Math::Prime::Util 0.73 - Math::Prime::Util::ChaCha 0.73 - Math::Prime::Util::Entropy 0.73 - Math::Prime::Util::MemFree 0.73 - Math::Prime::Util::PP 0.73 - Math::Prime::Util::PrimeArray 0.73 - Math::Prime::Util::PrimeIterator 0.73 - ntheory 0.73 - requirements: - Carp 0 - Config 0 - Exporter 5.57 - ExtUtils::MakeMaker 0 - Math::BigFloat 1.59 - Math::BigInt 1.88 - Math::Prime::Util::GMP 0.50 - Tie::Array 0 - XSLoader 0.01 - base 0 - constant 0 - perl 5.006002 - Math-Prime-Util-GMP-0.52 - pathname: D/DA/DANAJ/Math-Prime-Util-GMP-0.52.tar.gz - provides: - Math::Prime::Util::GMP 0.52 - requirements: - Carp 0 - Exporter 5.57 - ExtUtils::MakeMaker 0 - Fcntl 0 - XSLoader 0.01 - base 0 - perl 5.006002 diff --git a/challenge-159/polettix/raku/ch-1.raku b/challenge-159/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..e2c4ec19af --- /dev/null +++ b/challenge-159/polettix/raku/ch-1.raku @@ -0,0 +1,15 @@ +#!/usr/bin/env raku +use v6; +sub MAIN (Int:D \n = 4) { farey-sequence(n).join(', ').put } + +sub farey-sequence (Int:D \n) { + my ($a, $b, $c, $d) = (0, 1, 1, n); + gather { + take "$a/$b"; + while $c <= n { + my $k = ((n + $b) / $d).Int; + ($a, $b, $c, $d) = $c, $d, $k * $c - $a, $k * $d - $b; + take "$a/$b"; + } + } +} diff --git a/challenge-159/polettix/raku/ch-2.raku b/challenge-159/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..fb37765261 --- /dev/null +++ b/challenge-159/polettix/raku/ch-2.raku @@ -0,0 +1,18 @@ +#!/usr/bin/env raku +use v6; +multi sub MAIN (*@args) { put $_, ' ', möbius-number($_) for @args} + +sub möbius-number ($n is copy) { + return 0 if $n %% 4; + ($n, my $n-divisors) = $n %% 2 ?? (($n / 2).Int, 1) !! ($n, 0); + my $divisor = 3; + while $n >= $divisor { + if $n %% $divisor { + ++$n-divisors; + $n = ($n / $divisor).Int; + return 0 if $n %% $divisor; + } + $divisor += 2; # go through odd candidates only + } + return 1 - 2 * ($n-divisors % 2); +} -- cgit