I really enjoyed solving this one; palindromes have intrigued me since learned about them in grade school. Rather than repeat my mistake of getting too cute from Problem 3, I decided to brute-force this one. That approach did lead me to learn some nifty Python tricks though:
[::-1]for reversing a string
the newreversed` feature
xrangefor lazy range generation; I’d seen this one, but this is the first time I’d written it
Without further ado, here’s my solution to Problem 4.
"""Solves Problem 4 from Project Euler.""" def is_palindrome(to_test): """Determine whether to_test is a palindrome.""" # Uses extended slice syntax to reverse a sequence. return to_test == to_test[::-1] def problem_4(): """Function to solve problem 4.""" # I arrived at the values in the range by finding the smallest and largest # products of 2 3-digit numbers. for n in reversed(xrange(10000, 998001)): if is_palindrome(str(n)): for factor_1 in reversed(xrange(1000)): for factor_2 in reversed(xrange(1000)): if n == (factor_2 * factor_1): return n return 255 # Return a sentinel value to indicate failure. if __name__ == '__main__': print problem_4()
Back to flipping out…