Champernowne's Constant - Project Euler Problem 40


Problem

An irrational decimal fraction is created by concatenating the positive integers:

0.12345678910

It can be seen that the 12th digit of the fractional part is 1.

If dn represents the nth digit of the fractional part, find the value of the following expression.

d1 x d10 x d100 x d1000 x d10000 x d100000 x d1000000

Original Problem Source


Solution


 //speed depends on using StringBuilder, non-idiomatic since it is mutable  
 let rec NumArray start max maxLength (numString:System.Text.StringBuilder) =   
             if start = max || numString.Length >= maxLength then  
               numString.Append(start.ToString())  
             else  
               let newString = numString.Append(start.ToString())  
               let nextNum = start + 1  
               NumArray nextNum max maxLength newString  
   
 //cast string to int  
 let convertStringToInt32 (value:string) =   
   let mutable result = 0  
   let found = System.Int32.TryParse(value, &result)  
   result  
   
 //test for conversion  
 //let test_conversion = convertStringToInt32("1")  
   
 //starts timer  
 let startChampernowne = System.DateTime.Now  
   
 //create string builder and initialize it  
 let numStringStart = new System.Text.StringBuilder()  
 let startString = numStringStart.Append(".")  
   
 //variety of tests  
 //let test_numArray = NumArray 1 100 100000 numStringStart  
 //let test_stringPosition1 = test_numArray.Chars(0)  
 //let test_stringPosition10 = test_numArray.Chars(9)  
 //let test_stringPosition100 = test_numArray.Chars(99)  
 //let test_stringPosition12 = test_numArray.Chars(11)  
   
 //Create Champernowne's constant nd convert to string  
 let GetNumArray = NumArray 1 1000000 1000000 startString  
 let NumArrayToString = GetNumArray.ToString()  
   
 //find solution  
 let ProdOfValues =   
   convertStringToInt32(NumArrayToString.Chars(1).ToString())  
    * convertStringToInt32(NumArrayToString.Chars(10).ToString())  
    * convertStringToInt32(NumArrayToString.Chars(100).ToString())  
     * convertStringToInt32(NumArrayToString.Chars(1000).ToString())  
     * convertStringToInt32(NumArrayToString.Chars(10000).ToString())  
      * convertStringToInt32(NumArrayToString.Chars(100000).ToString())  
      * convertStringToInt32(NumArrayToString.Chars(1000000).ToString())  
   
 //end times  
 printfn "%s" ((System.DateTime.Now - startChampernowne).ToString())  
 

Popular posts from this blog

Digit cancelling fractions (Project Euler Problem 33)

Consecutive Prime Sum (Project Euler - Problem 50)

Coin Sums (Project Euler Problem 31)