aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubos Kolouch <lubos@kolouch.net>2022-06-18 10:41:06 +0200
committerLubos Kolouch <lubos@kolouch.net>2022-06-18 10:41:06 +0200
commite9980689bf705152fda312912ce18b65b16b5fa7 (patch)
treeb7f1a46e69e157e84813847c5f6cf173917b23c1
parent4a4cef8fc679ab2692253ca047a1bb9c46c58e8e (diff)
downloadperlweeklychallenge-club-e9980689bf705152fda312912ce18b65b16b5fa7.tar.gz
perlweeklychallenge-club-e9980689bf705152fda312912ce18b65b16b5fa7.tar.bz2
perlweeklychallenge-club-e9980689bf705152fda312912ce18b65b16b5fa7.zip
feat(challenge-169/lubos-kolouch/perl/ch-{1,2}.pl): Challenge 169 LK Perl Task 1 2
-rw-r--r--challenge-169/lubos-kolouch/perl/ch-1.pl47
-rw-r--r--challenge-169/lubos-kolouch/perl/ch-2.pl59
2 files changed, 106 insertions, 0 deletions
diff --git a/challenge-169/lubos-kolouch/perl/ch-1.pl b/challenge-169/lubos-kolouch/perl/ch-1.pl
new file mode 100644
index 0000000000..1967787fba
--- /dev/null
+++ b/challenge-169/lubos-kolouch/perl/ch-1.pl
@@ -0,0 +1,47 @@
+package main;
+use strict;
+use warnings;
+
+use Math::Prime::Util qw/factor/;
+
+sub is_brilliant_number {
+ my $number = shift;
+
+ my @factors = factor($number);
+
+ if ( ( scalar @factors == 2 ) and ( length( $factors[0] ) == length( $factors[1] ) ) ) {
+ return 1;
+ }
+
+ return 0;
+}
+
+sub generate_brilliant_numbers {
+ my $limit = shift;
+
+ my @brilliant_numbers;
+
+ my $i = 0;
+ while ( scalar @brilliant_numbers < $limit ) {
+ $i++;
+
+ if ( is_brilliant_number($i) ) {
+ push @brilliant_numbers, $i;
+ }
+ }
+
+ return \@brilliant_numbers;
+}
+
+use Test::More;
+
+is( is_brilliant_number(2), 0 );
+is( is_brilliant_number(4), 1 );
+is( is_brilliant_number(6), 1 );
+is( is_brilliant_number(187), 1 );
+
+is_deeply( generate_brilliant_numbers(20),
+ [ 4, 6, 9, 10, 14, 15, 21, 25, 35, 49, 121, 143, 169, 187, 209, 221, 247, 253, 289, 299 ] );
+
+done_testing;
+1;
diff --git a/challenge-169/lubos-kolouch/perl/ch-2.pl b/challenge-169/lubos-kolouch/perl/ch-2.pl
new file mode 100644
index 0000000000..8b8fcda497
--- /dev/null
+++ b/challenge-169/lubos-kolouch/perl/ch-2.pl
@@ -0,0 +1,59 @@
+package main;
+use strict;
+use warnings;
+use Math::Prime::Util qw/factor_exp gcd/;
+use List::Util qw/min/;
+
+sub is_achilles_number {
+
+# https://en.wikipedia.org/wiki/Achilles_number
+# A number n = p1a1p2a2…pkak is powerful if min(a1, a2, …, ak) ≥ 2. If in addition gcd(a1, a2, …, ak) = 1 the number is an Achilles number.
+
+ my $number = shift;
+
+ my @factors = factor_exp($number);
+ my $sum = 0;
+
+ my @exps;
+
+ for my $factor (@factors) {
+ my $e = $factor->[1];
+
+ push @exps, $e;
+ }
+
+ return 1 if ( min(@exps) >= 2 ) and ( gcd(@exps) == 1 );
+
+ return 0;
+}
+
+sub generate_achilles_numbers {
+ my $limit = shift;
+
+ my @achilles_numbers;
+
+ my $i = 2;
+
+ while ( scalar @achilles_numbers < $limit ) {
+ push @achilles_numbers, $i if is_achilles_number($i);
+ $i++;
+ }
+
+ return \@achilles_numbers;
+}
+
+use Test::More;
+
+is( is_achilles_number(36), 0 );
+is( is_achilles_number(72), 1 );
+
+is_deeply(
+ generate_achilles_numbers(20),
+ [
+ 72, 108, 200, 288, 392, 432, 500, 648, 675, 800,
+ 864, 968, 972, 1125, 1152, 1323, 1352, 1372, 1568, 1800
+ ]
+);
+
+done_testing;
+1;