Skip to content

Instantly share code, notes, and snippets.

@lprichar
Created August 27, 2016 05:40
Show Gist options
  • Select an option

  • Save lprichar/9761ade4583382022535a7bdd5f0d3c3 to your computer and use it in GitHub Desktop.

Select an option

Save lprichar/9761ade4583382022535a7bdd5f0d3c3 to your computer and use it in GitHub Desktop.
Generates Pascal's Triangle in F#
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