Largest palindrome product: Difference between revisions

Content added Content deleted
(→‎{{header|Go}}: Updated as per Wren.)
(→‎{{header|Raku}}: use external library for 25x speedup (still slow, but not dreadful))
Line 75: Line 75:


=={{header|Raku}}==
=={{header|Raku}}==
<lang perl6>use Prime::Factor;


<lang perl6>use Inline::Perl5;
.say for (1..11).hyper(:1batch).map: {.&lpp};
my $p5 = Inline::Perl5.new();
$p5.use: 'ntheory';
my &divisors = $p5.run('sub { ntheory::divisors $_[0] }');


.say for (2..12).map: {.&lpp};
multi lpp ($oom where {$_ +& 1}) { # even number of multiplicand digits

my $f = +(9 x ($oom + 1));
multi lpp ($oom where {!($_ +& 1)}) { # even number of multiplicand digits
my $o = (1 + $oom) / 2;
my $pal = +(9 x $o ~ 0 x $o * 2 ~ 9 x $o);
my $f = +(9 x $oom);
my $o = $oom / 2;
sprintf "Largest palindromic product of two %2d-digit integers: %d × %d = %d", $oom + 1, $pal div $f, $f, $pal
my $pal = +(9 x $o ~ 0 x $oom ~ 9 x $o);
sprintf "Largest palindromic product of two %2d-digit integers: %d × %d = %d", $oom, $pal div $f, $f, $pal
}
}


multi lpp ($oom where {$_ +^ 1}) { # odd number of multiplicand digits
multi lpp ($oom where {$_ +& 1}) { # odd number of multiplicand digits
my $p;
my $p;
(+(1 ~ (0 x $oom)) .. +(9 ~ (9 x $oom))).reverse.map({ +($_ ~ .flip) }).map: -> $pal {
(+(1 ~ (0 x ($oom - 1))) .. +(9 ~ (9 x ($oom - 1)))).reverse.map({ +($_ ~ .flip) }).map: -> $pal {
for my @factors = $pal.&divisors.grep({.chars == ($oom + 1)}).sort(-*) {
for my @factors = divisors("$pal")».Int.grep({ .chars == $oom }).sort( -* ) {
next unless $pal div $_ ∈ @factors;
next unless $pal div $_ ∈ @factors;
$p = sprintf("Largest palindromic product of two %2d-digit integers: %d × %d = %d", $oom + 1, $pal div $_, $_, $pal) and last;
$p = sprintf("Largest palindromic product of two %2d-digit integers: %d × %d = %d", $oom, $pal div $_, $_, $pal);
last;
}
}
last if $p;
last if $p;