I was exploring Jupyter notebooks , that combines live code, markdown and data, through Microsoft's implementation, known as MS Azure Notebooks , putting together a small library of R and F# notebooks . As Microsoft's FAQ for the service describes it as : ...a multi-lingual REPL on steroids. This is a free service that provides Jupyter notebooks along with supporting packages for R, Python and F# as a service. This means you can just login and get going since no installation/setup is necessary. Typical usage includes schools/instruction, giving webinars, learning languages, sharing ideas, etc. Feel free to clone and comment... In R Azure Workbook for R - Memoisation and Vectorization Charting Correlation Matrices in R In F# Charnownes Constant in FSharp.ipynb Project Euler - Problems 18 and 67 - FSharp using Dynamic Programming
Problem
An irrational decimal fraction is created by concatenating the positive integers:
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.
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())
Comments
Post a Comment