Last active
August 29, 2015 14:19
-
-
Save monkieboy/50411e26e1e5f0aecbaa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//--------------------------------------------------------------- | |
// Apply Your Knowledge! | |
// | |
// Below is a list containing comma separated data about | |
// Microsoft's stock prices during March of 2012. Without | |
// modifying the list, programatically find the day with the | |
// greatest variance between the opening and closing price. | |
// | |
// The following functions may be of use: | |
// | |
// abs - takes the absolute value of an argument | |
// | |
// System.Double.Parse - converts a string argument into a | |
// numerical value. | |
// | |
// The following function will convert a comma separated string | |
// into an array of the column values. | |
// | |
// let splitCommas (x:string) = | |
// x.Split([|','|]) | |
//--------------------------------------------------------------- | |
[<Koan(Sort = 15)>] | |
module ``about the stock example`` = | |
let stockData = | |
[ "Date,Open,High,Low,Close,Volume,Adj Close"; | |
"2012-03-30,32.40,32.41,32.04,32.26,31749400,32.26"; | |
"2012-03-29,32.06,32.19,31.81,32.12,37038500,32.12"; | |
"2012-03-28,32.52,32.70,32.04,32.19,41344800,32.19"; | |
"2012-03-27,32.65,32.70,32.40,32.52,36274900,32.52"; | |
"2012-03-26,32.19,32.61,32.15,32.59,36758300,32.59"; | |
"2012-03-23,32.10,32.11,31.72,32.01,35912200,32.01"; | |
"2012-03-22,31.81,32.09,31.79,32.00,31749500,32.00"; | |
"2012-03-21,31.96,32.15,31.82,31.91,37928600,31.91"; | |
"2012-03-20,32.10,32.15,31.74,31.99,41566800,31.99"; | |
"2012-03-19,32.54,32.61,32.15,32.20,44789200,32.20"; | |
"2012-03-16,32.91,32.95,32.50,32.60,65626400,32.60"; | |
"2012-03-15,32.79,32.94,32.58,32.85,49068300,32.85"; | |
"2012-03-14,32.53,32.88,32.49,32.77,41986900,32.77"; | |
"2012-03-13,32.24,32.69,32.15,32.67,48951700,32.67"; | |
"2012-03-12,31.97,32.20,31.82,32.04,34073600,32.04"; | |
"2012-03-09,32.10,32.16,31.92,31.99,34628400,31.99"; | |
"2012-03-08,32.04,32.21,31.90,32.01,36747400,32.01"; | |
"2012-03-07,31.67,31.92,31.53,31.84,34340400,31.84"; | |
"2012-03-06,31.54,31.98,31.49,31.56,51932900,31.56"; | |
"2012-03-05,32.01,32.05,31.62,31.80,45240000,31.80"; | |
"2012-03-02,32.31,32.44,32.00,32.08,47314200,32.08"; | |
"2012-03-01,31.93,32.39,31.85,32.29,77344100,32.29"; | |
"2012-02-29,31.89,32.00,31.61,31.74,59323600,31.74"; ] | |
// Feel free to add extra [<Koan>] members here to write | |
// tests for yourself along the way. You can also try | |
// using the F# Interactive window to check your progress. | |
let splitCommas (x:string) = | |
x.Split([|','|]) | |
let parseD x = | |
System.Double.Parse x | |
let date = | |
stockData | |
|> List.map (fun i -> i |> splitCommas) | |
|> List.toSeq | |
|> Seq.skip 1 | |
|> Seq.pairwise | |
|> Seq.map (fun (a,b) -> (a.[0], ((a.[6] |> parseD) - (b.[6] |> parseD)) |> abs)) | |
|> Seq.maxBy (fun a -> a |> snd) | |
|> fst | |
[<Koan>] | |
let YouGotTheAnswerCorrect() = | |
let result = date | |
AssertEquality "2012-03-13" result |
The Koan passes but I think it could easily be done better by someone with more knowledge than I.
let date =
stockData
|> List.map (fun i -> i |> splitCommas)
|> List.tail
|> Seq.pairwise
|> Seq.map (fun (a,b) -> (a.[0], ((a.[6] |> parseD) - (b.[6] |> parseD)) |> abs))
|> Seq.maxBy snd
|> fst
Without the fun on splitCommas:
let date =
stockData
|> List.map splitCommas
|> List.tail
|> Seq.pairwise
|> Seq.map (fun (a,b) -> (a.[0], ((a.[6] |> parseD) - (b.[6] |> parseD)) |> abs))
|> Seq.maxBy snd
|> fst
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can you help me optimise the 'let date' value?