aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-066/3ter/ch-2.pl44
1 files changed, 44 insertions, 0 deletions
diff --git a/challenge-066/3ter/ch-2.pl b/challenge-066/3ter/ch-2.pl
new file mode 100644
index 0000000000..c1258b6253
--- /dev/null
+++ b/challenge-066/3ter/ch-2.pl
@@ -0,0 +1,44 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use v5.30;
+
+my ($int) = @ARGV;
+die 'Please provide one integer e.g. \'ch-2.pl 9\''
+ if ( !defined($int) );
+
+say power_integers($int);
+
+sub power_integers {
+ my ($int) = @_;
+
+ my ( $factor, $power ) = get_factor_and_power($int);
+ if ( defined($power) and $power > 0 ) {
+ return $factor . '^' . $power;
+ }
+ else {
+ return 0;
+ }
+}
+
+sub get_factor_and_power {
+ my ($int) = @_;
+
+ # try those factors naively
+ my $factor;
+ my $max_factor = int( sqrt($int) );
+ foreach my $potential_factor ( 2 .. $max_factor ) {
+ if ( $int % $potential_factor == 0 ) {
+ $factor = $potential_factor;
+
+ # verify that the factor is powerful enough
+ my $power = 1;
+ while ( $factor**$power < $int ) {
+ $power++;
+ }
+ return ( $factor, $power ) if ( $factor**$power == $int );
+ }
+ }
+ return 0;
+}
+