Skip to main content

Microsoft Azure Notebooks - Live code - F#, R, and Python

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

Coin Sums (Project Euler Problem 31)


Problem

In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
It is possible to make £2 in the following way:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
How many different ways can £2 be made using any number of coins?

Original problem description...

Note

This is a clean, although slow, solution, taking longer than one minute to complete.

Solution




 // code for finding result, returned as a sequence
 let sumCurrencies ones twos fives tens twenties fifties oneHundreds twoHundreds limit =   
               //seq{  
                 [let counter = 0  
                 for twoHundred in twoHundreds do   
                   for oneHundred in oneHundreds do   
                     for fifty in fifties do  
                       for twenty in twenties do   
                         for ten in tens do   
                            for five in fives do   
                             for two in twos do   
                               for one in ones do   
                                 if ((one * 1) +   
                                   (two * 2) +   
                                   (five * 5) +   
                                   (ten * 10) +   
                                   (twenty * 20) +   
                                   (fifty * 50) +   
                                   (oneHundred * 100) +   
                                   (twoHundred * 200)) = limit then  
                                     yield one, two, five, ten, twenty, fifty, oneHundred, twoHundred]  
                                     //}  
   
 //call function for building possible currency arrays
 let buildCurrencyArray currency limit = List.append [0] [for i=1 to limit/currency do  
                               if limit % currency = 0 then  
                                 yield i]  
   
 //builds arrays of currencies
 let buildCurrencyArray_200 = buildCurrencyArray 200 200  
 let buildCurrencyArray_100 = buildCurrencyArray 100 200  
 let buildCurrencyArray_050 = buildCurrencyArray 50 200  
 let buildCurrencyArray_020 = buildCurrencyArray 20 200  
 let buildCurrencyArray_010 = buildCurrencyArray 10 200  
 let buildCurrencyArray_005 = buildCurrencyArray 5 200  
 let buildCurrencyArray_002 = buildCurrencyArray 2 200  
 let buildCurrencyArray_001 = buildCurrencyArray 1 200  
 
 //builds sequence
 let variousCurrencyFormulations =   
       sumCurrencies   
         buildCurrencyArray_001   
         buildCurrencyArray_002   
         buildCurrencyArray_005   
         buildCurrencyArray_010   
         buildCurrencyArray_020   
         buildCurrencyArray_050   
         buildCurrencyArray_100   
         buildCurrencyArray_200 200  
   
 //let variousCurrencyFormulationsResult =   
 //variousCurrencyFormulations |> Seq.iter (fun x -> printfn "%A" x)  

 //execution without timing
 //let variousCurrencyFormulationsResultLength = List.length variousCurrencyFormulations  

 //execution with timing
 let startCurrency = System.DateTime.Now  
 let variousCurrencyFormulationsResultLength = Seq.length variousCurrencyFormulations  
 printfn "%s" ((System.DateTime.Now - startCurrency).ToString())  

Comments

Popular posts from this blog

Microsoft Azure Notebooks - Live code - F#, R, and Python

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

Consecutive Prime Sum (Project Euler - Problem 50)

Problem The prime 41, can be written as the sum of six consecutive primes: 41 = 2 + 3 + 5 + 7 + 11 + 13 This is the longest sum of consecutive primes that adds to a prime below one-hundred. The longest sum of consecutive primes below one-thousand that adds to a prime, contains 21 terms, and is equal to 953. Which prime, below one-million, can be written as the sum of the most consecutive primes? Note Some libraries used in this code are F# modules I use, but have also published as a  Nuget library , such as EulerLib.GetPrimes() and  EulerLib. isPrime(). You need to reference the NuGetLibrary to use this code as is. Solution #load "Stat.fs" #load "Print.fs" #load "EulerLib.fs" open Stat open Print open EulerLib open System let rec FindLongestPrimeSequenceSum (primeList:list ) (nextItem:int) lessThanValue (primeArray:list ) bestPrime (correctArray:list )

Digit cancelling fractions (Project Euler Problem 33)

Problem The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s. We shall consider fractions like, 30/50 = 3/5, to be trivial examples. There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator. If the product of these four fractions is given in its lowest common terms, find the value of the denominator. (link to Problem 33 on the Project Euler site) Note This is a somewhat crude solution, since I am only just getting back into solving these problems, or working with F#, but there are several similar problems for which I can develop properly factored, reusable functions. Solution open System let product xs ys = seq{for x in xs do for y in ys do let a = float x % float 10