Problem 4

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.

Działa od wersji >= 1.8.7 (nie było metody Array#product w <= 1.8.6)

a, b = (100..999).to_a.product((100..999).to_a). select {|a, b| "#{a * b}" == "#{a * b}".reverse }. max_by {|a, b| a * b } puts "#{a} x #{b} = #{a * b}"

Wersja mniej kompaktowa, ale za to omijająca połowę mnożeń (liczenie ba gdy już mamy ab) i sprawdzająca „palindromowatość” tylko do pierwszego trafienia:

products = [] (100..999).each do |a| (100..a).each do |b| products << [a, b, a*b] end end products = products.sort_by(&:last).reverse products.find { |a, b, prod| prod.to_s == prod.to_s.reverse } # => [993, 913, 906609]

[code=Ruby]max = 0
(100…999).each {|i| (100…999).select {|j| max = i * j if (i * j > max) && ((i * j).to_s == (i * j).to_s.reverse)}}
p max

=> 906609[/code]

Moje rozwiązanie:

[code=Ruby]a,b = Array.new, Array.new
(110…999).step(11) do |n|
a.unshift(n)
end

a.each do |n|
999.downto(n).each do |m|
num = n*m
b << num if (num == num.to_s.reverse.to_i)
end
end

puts b.max[/code]

Array to klasa

tylko na co ta tablica z palindromami, skoro potrzebny Ci tylko jeden - największy? wrzucanie w pętli do drugiej tablicy z Range’a też bez sensu…

[code=ruby]max, range = 0, (110…999).step(11).to_a

def palindrome?(n)
n == n.to_s.reverse.to_i
end

range.reverse_each do |n|
999.downto(n).each do |m|
num = n*m
if palindrome?(num) && num > max
max = num
break # nie ma co liczyć dla następnego m bo na bank będzie mniejszy :wink:
end
end
end

puts max[/code]