RabbitFarm
2022-05-15
Happily Computing Prime Palindrome Numbers
The examples used here are from the weekly challenge problem statement and demonstrate the working solution.
Part 1
Write a script to find all prime numbers less than 1000, which are also palindromes in base 10.
Solution
use strict;
use warnings;
use Math::Primality qw/is_prime/;
sub palindrome_primes_under{
my($n) = shift;
my @palindrome_primes;
{
$n--;
unshift @palindrome_primes, $n if(is_prime($n) && join("", reverse(split(//, $n))) == $n);
redo if $n > 1;
}
return @palindrome_primes;
}
MAIN:{
print join(", ", palindrome_primes_under(1000));
}
Sample Run
$ perl perl/ch-1.pl
2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929
Notes
I have become incorrigible in my use of redo
! The novelty just hasn't worn off I
suppose. There is nothing really wrong with it, of course, it's just not particularly
modern convention what with it's vaguely goto
like behavior. Anyway, there's not a whole
lot to cover here. All the real work is done in the one line which tests both primality
and, uh, palindromedary.
Part 2
Write a script to find the first 8 Happy Numbers in base 10.
Solution
use strict;
use warnings;
use boolean;
use constant N => 8;
sub happy{
my $n = shift;
my @seen;
my $pdi = sub{
my $n = shift;
my $total = 0;
{
$total += ($n % 10)**2;
$n = int($n / 10);
redo if $n > 0;
}
return $total;
};
{
push @seen, $n;
$n = $pdi->($n);
redo if $n > 1 && (grep {$_ == $n} @seen) == 0;
}
return boolean($n == 1);
}
MAIN:{
my $i = 0;
my @happy;
{
$i++;
push @happy, $i if happy($i);
redo if @happy < N;
}
print join(", ", @happy) . "\n";
}
Sample Run
$ perl perl/ch-2.pl
1, 7, 10, 13, 19, 23, 28, 31
Notes
This solution has even more redo
, huzzah! Again, fairly straightforward bit of code
which follows the definitions. The happiness check is done using a perfect digit
invariant (PDI) function, here rendered as an anonymous inner subroutine. A good chance
here when looking at this code to remind ourselves that $n
inside that anonymous
subroutine is in a different scope and does not effect the outer $n
!
References
posted at: 23:58 by: Adam Russell | path: /perl | permanent link to this entry