Largest palindrome product

From Rosetta Code
Revision as of 13:09, 3 November 2021 by Thundergnat (talk | contribs) (→‎{{header|Raku}}: tweaks)
Largest palindrome product is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task


Task description is taken from Project Euler (https://projecteuler.net/problem=4)
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.

Go

Translation of: Wren

Though, unlike Wren, can deal with 18 digit integers. Note also that it's a lot quicker in Go to reverse a number arithmetically than to reverse its string equivalent. <lang go>package main

import "fmt"

func reverse(n uint64) uint64 {

   r := uint64(0)
   for n > 0 {
       r = n%10 + r*10
       n /= 10
   }
   return r

}

func main() {

   pow := uint64(10)

nextN:

   for n := 2; n < 10; n++ {
       low := pow*9 + 1
       pow *= 10
       high := pow - 1
       fmt.Printf("Largest palindromic product of two %d-digit integers: ", n)
       for i := high; i >= low; i-- {
           for j := high; j >= low; j-- {
               p := i * j
               if p%10 != 9 {
                   continue
               }
               if p == reverse(p) {
                   fmt.Printf("%d x %d = %d\n", i, j, p)
                   continue nextN
               }
           }
       }
   }

}</lang>

Output:
Largest palindromic product of two 2-digit integers: 99 x 91 = 9009
Largest palindromic product of two 3-digit integers: 993 x 913 = 906609
Largest palindromic product of two 4-digit integers: 9999 x 9901 = 99000099
Largest palindromic product of two 5-digit integers: 99979 x 99681 = 9966006699
Largest palindromic product of two 6-digit integers: 999999 x 999001 = 999000000999
Largest palindromic product of two 7-digit integers: 9999979 x 9467731 = 94677111177649
Largest palindromic product of two 8-digit integers: 99999999 x 99990001 = 9999000000009999
Largest palindromic product of two 9-digit integers: 999999969 x 998396971 = 998396940049693899

Raku

<lang perl6>use Prime::Factor;

.say for (1..9).hyper(:1batch).map: {.&lpp} ;

multi lpp ($oom where {$_ +& 1}) {

   my $f = +(9 x ($oom + 1));
   my $o = (1 + $oom) / 2;
   my $pal = +(9 x $o ~ 0 x $o * 2 ~ 9 x $o);
   sprintf "Largest palindromic product of two %2d-digit integers: %d × %d = %d", $oom + 1, $pal div $f, $f, $pal

}

multi lpp ($oom where {$_ +^ 1}) {

   my $f = 9 x $oom;
   my $p;
   (+(1 ~ (0 x $oom)) .. +(9 ~ (9 x $oom))).reverse.map({ +($_ ~ .flip) }).map: -> $pal {
       for my @factors = $pal.&divisors.grep({.chars == ($oom + 1)}).sort(-*) {
           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;
       }
       last if $p;
   }
   $p

}</lang>

Largest palindromic product of two  2-digit integers: 91 × 99 = 9009
Largest palindromic product of two  3-digit integers: 913 × 993 = 906609
Largest palindromic product of two  4-digit integers: 9901 × 9999 = 99000099
Largest palindromic product of two  5-digit integers: 99681 × 99979 = 9966006699
Largest palindromic product of two  6-digit integers: 999001 × 999999 = 999000000999
Largest palindromic product of two  7-digit integers: 9997647 × 9998017 = 99956644665999
Largest palindromic product of two  8-digit integers: 99990001 × 99999999 = 9999000000009999
Largest palindromic product of two  9-digit integers: 999920317 × 999980347 = 999900665566009999
Largest palindromic product of two 10-digit integers: 9999900001 × 9999999999 = 99999000000000099999

Ring

<lang ring> load "stdlib.ring" see "working..." + nl

prodOld = 0 limitStart = 100 limitEnd = 999

for n = limitStart to limitEnd

   for m = limitStart to limitEnd
       prodNew = n*m
       if prodNew > prodOld and palindrome(string(prodNew))
          prodOld = prodNew
          first = n
          second = m
       ok
   next

next

see "The largest palindrome is:" + nl see "" + first + " * " + second + " = " + prodOld + nl see "done..." + nl </lang>

Output:
working...
The largest palindrome is:
913 * 993 = 906609
done...

Wren

<lang ecmascript>var pow = 10 for (n in 2..7) {

   var low = pow * 9 + 1
   pow = pow * 10
   var high = pow - 1
   System.write("Largest palindromic product of two %(n)-digit integers: ")
   var nextN = false
   for (i in high..low) {
       for (j in high..low) {
           var p = i * j
           if (p%10 != 9) continue
           var s = p.toString
           if (s == s[-1..0]) {
               System.print("%(i) x %(j) = %(p)")
               nextN = true
               break                   
           }
       }
       if (nextN) break
   }

}</lang>

Output:
Largest palindromic product of two 2-digit integers: 99 x 91 = 9009
Largest palindromic product of two 3-digit integers: 993 x 913 = 906609
Largest palindromic product of two 4-digit integers: 9999 x 9901 = 99000099
Largest palindromic product of two 5-digit integers: 99979 x 99681 = 9966006699
Largest palindromic product of two 6-digit integers: 999999 x 999001 = 999000000999
Largest palindromic product of two 7-digit integers: 9999979 x 9467731 = 94677111177649