aboutsummaryrefslogtreecommitdiff
path: root/challenge-102/dave-jacoby/perl/ch-1.pl
blob: 05d5ddad0790efd6e3777396f4d8703c8a077fbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env perl

use strict;
use warnings;
use feature qw{ postderef say signatures state };
no warnings qw{ experimental };

use Carp;

my $i = shift @ARGV;
$i //= 2;
croak 'non-positive integer' if $i < 1;
croak 'not an integer'       if $i =~ /\D/;

say join "\n\t", "RARE NUMBERS: $i", rare_numbers($i), '';

# a number r is "rare" when:
#   - r1 is that number reversed
#   - sqrt(r+r1) is an integer
#   - sqrt(r-r1) is an integer
sub rare_numbers ( $i ) {
    my @output;

    # given i == 5,
    # low is 10000, the smallest five-digit number
    # high is 99999, the highest five-digit number
    my $low  = join '', map { $_ == 1 ? 1 : 0 } 1 .. $i;
    my $high = 9 x $i;

    for my $r ( $low .. $high ) {
        my $r1 = reverse $r;
        next if $r - $r1 < 0;    # early block for thing that break sqrt

        my $s1 = sqrt( $r + $r1 );
        next if $s1 =~ /\D/;     # test if integer

        my $s2 = sqrt( $r - $r1 );
        next if $s2 =~ /\D/;     # test if integer


        push @output, $r;
    }
    return @output;
}