diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2021-12-13 19:34:16 +0100 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2021-12-13 19:34:16 +0100 |
| commit | 50e1d3c36fa027ad2aa3ef5f1b3d07c878778d0d (patch) | |
| tree | 1f926339b41d2449b1a7a1b7fc77687024bfbe87 | |
| parent | 01abcc4707c7ec90cca53911b106dca663a44bde (diff) | |
| download | perlweeklychallenge-club-50e1d3c36fa027ad2aa3ef5f1b3d07c878778d0d.tar.gz perlweeklychallenge-club-50e1d3c36fa027ad2aa3ef5f1b3d07c878778d0d.tar.bz2 perlweeklychallenge-club-50e1d3c36fa027ad2aa3ef5f1b3d07c878778d0d.zip | |
Add solution for challenge 143 part 2
| -rwxr-xr-x | challenge-143/alexander-pankoff/perl/ch-2.pl | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/challenge-143/alexander-pankoff/perl/ch-2.pl b/challenge-143/alexander-pankoff/perl/ch-2.pl new file mode 100755 index 0000000000..8eba88cc93 --- /dev/null +++ b/challenge-143/alexander-pankoff/perl/ch-2.pl @@ -0,0 +1,61 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use feature qw'say signatures'; +no warnings qw'experimental::signatures'; + +use List::Util qw'first'; + +use constant DEBUG => $ENV{DEBUG} // 0; + +run() unless caller(); + +sub run() { + my $stealthy = stealthy( $ARGV[0] ); + say $stealthy ? 1 : 0; + explain($stealthy) if DEBUG; +} + +sub stealthy($n) { + my @divisors = find_divisors_pairs($n); + my @pairs = pairs(@divisors); + + my $stealthy = first { + my ( $a, $b, $c, $d ) = flatten($_); + $a * $b == $c * $d && $a + $b == $c + $d + 1; + } + @pairs; + + return $stealthy; +} + +sub explain($stealthy) { + say "Not stealthy" && return if !$stealthy; + my ( $a, $b, $c, $d ) = flatten($stealthy); + say +"Since $a (a) * $b (b) = $c (c) * $d (d) and $a (a) + $b (b) = $c (c) + $d (d) + 1"; +} + +sub pairs(@xs ) { + my @out; + for my $i ( 0 .. $#xs - 1 ) { + push @out, map { [ $xs[$i], $xs[$_] ] } ( $i + 1 .. $#xs ); + } + return @out; +} + +sub flatten($xs) { + map { @$_ } @$xs; +} + +sub find_divisors_pairs($x) { + my @out; + my $max = sqrt($x); + for my $i ( 1 .. $max ) { + if ( $x % $i == 0 ) { + push @out, [ $i, $x / $i ]; + } + } + + return @out; +} |
