Created
August 27, 2016 05:40
-
-
Save lprichar/9761ade4583382022535a7bdd5f0d3c3 to your computer and use it in GitHub Desktop.
Generates Pascal's Triangle in F#
This file contains hidden or 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
| open System | |
| let totalRows = 9 | |
| type Node = | |
| { Row: int; | |
| Position: int; | |
| Value: int | |
| } | |
| let rec solveNode row pos = | |
| if (pos = 1 || row = pos) then | |
| 1 | |
| else | |
| let previousRow = row-1 | |
| let parent1 = solveNode previousRow pos | |
| let parent2 = solveNode previousRow (pos-1) | |
| parent1 + parent2 | |
| let makeNode pos row = | |
| let value = solveNode row pos | |
| { Row = row; | |
| Position = pos; | |
| Value = value } | |
| let makeRow (rowNumber:int) = | |
| [ 1 .. rowNumber ] | |
| |> List.map makeNode | |
| |> List.map (fun curry -> curry rowNumber) | |
| let makeNodesOfTriangle depth = | |
| [1..depth] | |
| |> List.map makeRow | |
| |> List.collect (fun i -> i) | |
| let pad chars = | |
| List.map (fun _ -> " ") [0..chars] | |
| |> List.fold (fun a b -> a + b) "" | |
| let spacesForRow totalRows = | |
| pad (totalRows - 1) | |
| let nodeValAsString node = | |
| let value = node.Value | |
| if (value <= 9) then | |
| " " + (string node.Value) | |
| else | |
| (string node.Value) | |
| let rowToString nodesInRow row totalRows = | |
| let spacesAtRow = (totalRows - row) * 2 | |
| let spaces = spacesForRow spacesAtRow | |
| let values = | |
| nodesInRow | |
| |> List.sortBy (fun i -> i.Position) | |
| |> List.map nodeValAsString | |
| |> List.fold (fun str nodeVal -> str + " " + nodeVal) "" | |
| spaces + values | |
| let getNode nodes row pos = | |
| nodes | |
| |> List.find (fun node -> node.Row = row && node.Position = pos) | |
| [<EntryPoint>] | |
| let main argv = | |
| let rowsAsStrings = | |
| makeNodesOfTriangle totalRows | |
| |> List.groupBy (fun (i) -> i.Row) | |
| |> List.map (fun (key, value) -> rowToString value key totalRows) | |
| let ignore = List.map (fun rowAsStr -> printfn "%s" rowAsStr) rowsAsStrings | |
| let s = Console.ReadLine() | |
| 0 // return an integer exit code |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment