Tuesday, August 9, 2011

Project Euler Problem #4


Moving on along with these Project Euler problems, Problem 4 states this:

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.


This just reeks of a brute force method. But that is fine. I don't think it will be that strenuous.

First we need a function that determines if a computed number is a palindrome. This is what I came up with:

 public bool IsPalindromic(string item)
 {
  return item.SequenceEqual(item.Reverse());
 }


Here we will take in a string representation of a number (or anything really) and use the handy 'SequenceEqual' and 'Reverse' extension methods. Now I actually read somewhere that the 'Reverse' method bogs down performance more than using any other method, but it wasn't enough to affect my performance so I kept it just because it is short and concise.

Now we have to iterate through all the possibilities and check if the given product is a palindrome. There are two ways I can do this:

Lambda:

 return Enumerable.Range(100, 900)
  .Select(i => Enumerable.Range(i, 1000 - i)
  .Where(j => newTools.IsPalindromic((i * j).ToString()))
  .Select(j => i * j)
  .OrderBy(j => j)
  .LastOrDefault())
  .Max();


Or Linq:

 return (from i in Enumerable.Range(100, 900)
  from j in Enumerable.Range(i, 1000 - i)
  let product = i * j
  where newTools.IsPalindromic(product.ToString())
  select product).Max();


Upon first glance the Linq option seems a lot cleaner and easier to read. And it might be. I guess I have no preference because both run just about as fast and return the correct answer, so it just depends on preference.

There ya go. Easy as pie.

No comments:

Post a Comment