Project Euler in F#!

#### Project Euler: Problem 4

Find the largest palindrome made from the product of two 3-digit numbers.

#### Example

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

#### Solution

I seriously don't like how I came about with this solution and I think to myself that it is the worst of them out there. I suppose not knowing every single operator or trick in F# results in coding like this.

The idea behind this was that once I found a product, I needed to test if it was a palindrome. I even thought about trying out regular expressions but I felt more comfortable with this approach although it is a bit more verbose than I had hoped for. So I converted each product to a string and further broke the String down to a character array since I could then use the Array.rev function to reverse the members of an array.

So the formula here is to calculate the produce, convert it to a string, get the reverse of the string and compare the two for equality. Note that F# has built in support for reverse for loops using the downto keyword. Also, the problem asked specifically for 3-digit computations, so I figured out that the best best was the try all products in the range of 900-999 first, then go lower if need be.

1 #light

2 #r "FSharp.PowerPack.dll"

3

4 // function to reverse a string

5 let reverseString (num: int) =

6 // convert to a string, then to char array,

7 // then call Array.rev

8 let charArray =

9 Array.rev ((num.ToString()).ToCharArray())

10 let mutable str = ""

11 // loop through each character in

12 // the char array and add each to an

13 // empty string

14 for i = 0 to charArray.Length - 1 do

15 let value = string charArray.[i]

16 str <- str + value

17 str // return reversed string

18

19 let palindrome (p: int) =

20 // create emtpty string to hold results

21 let mutable res = ""

22 for i = p downto 900 do

23 for j = p downto 900 do

24 let num = i * j

25 let numToStr = num.ToString()

26 let revString = reverseString num

27 if (revString = numToStr) then

28 printfn "------%d, %d" i j

29 res <- numToStr

30 res // this will not return the correct result

31 // need to use the command window and get the

32 // first i,j pair

33 // the result is: 993 * 913 = 906609

## No comments:

Post a Comment