Question
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 \times 99.
Find the largest palindrome made from the product of two 3-digit numbers.
Clojure
#!/usr/bin/env clojuredefn palindrome? [n]
(= (seq (str n)) (reverse (str n))))
(
defn palindromes [limit]
(filter palindrome? (for [a (range 100 1000) b (range a 1000)] (* a b))))
(
println (reduce max (palindromes 1000))) (
$ time clojure palindrome.clj
real 0m1.213s
user 0m2.255s
sys 0m0.196s
Go
package main
import "fmt"
func IsPalindrome(number int) bool {
:= number
n , digit := 0, 0
reversedfor n > 0 {
= n % 10
digit = reversed*10 + digit
reversed /= 10
n }
return number == reversed
}
func main() {
, max := 0, 0
productfor a := 100; a < 1000; a++ {
for b := a; b < 1000; b++ {
= a * b
product if product > max && IsPalindrome(product) {
= product
max }
}
}
.Println(max)
fmt}
$ go build -o palindrome palindrome.go
$ time ./palindrome
real 0m0.002s
user 0m0.000s
sys 0m0.002s
Haskell
isPalindrome :: Integer -> Bool
= show n == reverse (show n)
isPalindrome n
main :: IO ()
= print $ maximum [prod | a <- [100..999], b <- [a..999], let prod = a * b, isPalindrome prod] main
$ ghc -O2 -o palindrome palindrome.hs
$ time ./palindrome
real 0m0.046s
user 0m0.046s
sys 0m0.000s
JavaScript
const isPalindrome = (s) => s === s.split("").reverse().join("")
let max = 0
for (let i = 100; i < 1000; i++) {
for (let j = 100; j < 1000; j++) {
const s = (i * j)
if (s > max && isPalindrome(s.toString())) {
= s
max
}
}
}console.log(max)
$ time node --use-strict palindrome.js
real 0m0.083s
user 0m0.082s
sys 0m0.008s
Python
#!/usr/bin/env python
print(max(a * b for a in range(100, 1000) for b in range(a, 1000) if str(a * b) == str(a * b)[::-1]))
$ time python3 palindrome.py
real 0m0.318s
user 0m0.310s
sys 0m0.008s
Ruby
#!/usr/bin/env ruby
class Integer
def palindromic?
= self.to_s.split('')
digits return digits == digits.reverse
end
end
= 0
max 100..999).each do |a|
(..999).each do |b|
(a= a * b
product if product > max and product.palindromic?
= product
max end
end
end
puts max
$ time ruby palindrome.rb
real 0m0.284s
user 0m0.276s
sys 0m0.008s
Rust
fn is_palindrome(number: u64) -> bool {
let mut n = number;
let mut reversed = 0;
while n > 0 {
let digit = n % 10;
= reversed * 10 + digit;
reversed /= 10;
n }
== reversed
number }
fn main() {
let mut largest = 0;
for a in 100..1000 {
for b in 100..1000 {
let product = a * b;
if product > largest && is_palindrome(product) {
= product;
largest }
}
}
println!("{}", largest);
}
$ rustc -C target-cpu=native -C opt-level=3 -o palindrome palindrome.rs
$ time ./palindrome
real 0m0.002s
user 0m0.000s
sys 0m0.002s