Largest palindrome product: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Raku}}: whoops, delete some leftover dead code from refactoring)
m (→‎{{header|Raku}}: 11 digits takes an unreasonably long time...)
Line 63: Line 63:
<lang perl6>use Prime::Factor;
<lang perl6>use Prime::Factor;


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


multi lpp ($oom where {$_ +& 1}) { # even number of multiplicand digits
multi lpp ($oom where {$_ +& 1}) { # even number of multiplicand digits
Line 91: Line 91:
Largest palindromic product of two 8-digit integers: 99990001 × 99999999 = 9999000000009999
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 9-digit integers: 999920317 × 999980347 = 999900665566009999
Largest palindromic product of two 10-digit integers: 9999900001 × 9999999999 = 99999000000000099999</pre>
Largest palindromic product of two 10-digit integers: 9999900001 × 9999999999 = 99999000000000099999
Largest palindromic product of two 11-digit integers: 99999943851 × 99999996349 = 9999994020000204999999
Largest palindromic product of two 12-digit integers: 999999000001 × 999999999999 = 999999000000000000999999</pre>


=={{header|Ring}}==
=={{header|Ring}}==

Revision as of 14:58, 3 November 2021

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

Note also that it's a lot quicker in Go to reverse a number arithmetically than to reverse its string equivalent but finding the result for 6-digit numbers is still very slow. <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 < 7; n++ {
       low := pow*9 + 1
       pow *= 10
       high := pow - 1
       fmt.Printf("Largest palindromic product of two %d-digit integers: ", n)
       for p := high * high; p >= low*low; p-- {
           if p%10 != 9 {
               continue
           }
           for i := high; i >= low; i-- {
               var j = p / i
               if j > high {
                   break
               }
               if p%i == 0 {
                   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

Raku

<lang perl6>use Prime::Factor;

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

multi lpp ($oom where {$_ +& 1}) { # even number of multiplicand digits

   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}) { # odd number of multiplicand digits

   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
Largest palindromic product of two 11-digit integers: 99999943851 × 99999996349 = 9999994020000204999999
Largest palindromic product of two 12-digit integers: 999999000001 × 999999999999 = 999999000000000000999999

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..5) {

   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 (p in high * high..low * low) {
       if (p%10 != 9) continue
       for (i in high..low) {
           var j = p / i
           if (j > high) break
           if (p % i == 0) {
               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