Skip to content

Instantly share code, notes, and snippets.

@bjartwolf
Last active August 29, 2015 14:21
Show Gist options
  • Save bjartwolf/4056746b2748a8c8ded4 to your computer and use it in GitHub Desktop.
Save bjartwolf/4056746b2748a8c8ded4 to your computer and use it in GitHub Desktop.
type number = Number of int * symbol | End of int
and symbol = Plus of number | Minus of number| Join of number
let rec genSolutions (s:int) (stopp: int) = seq {
if s = stopp then yield End s
else for g in genSolutions (s+1) stopp do
yield Number(s, Plus (g))
yield Number(s, Minus (g))
yield Number(s, Join (g))
}
let merge (i1: int) (i2: int) = sign i1 * (abs i1*10+i2)
let rec flatten (n: number): number =
match n with
| End i-> End i
| Number (i1, Join (Number (i2,s))) -> flatten (Number (merge i1 i2,s))
| Number (i1, Join (End i2)) -> flatten (End (merge i1 i2))
| Number (i1, s) -> Number (i1,s)
let rec toList (n: number) : int list =
let num = flatten n
match num with
| End i -> [i]
| Number (i,s) -> match s with
| Plus (n) -> i :: toList n
| Minus (Number (j,k)) -> i :: toList (Number(-j,k))
| Minus (End (j)) -> i :: [-j]
| _ -> failwith "should not have join after flatten"
genSolutions 1 9 |> Seq.map(toList)|> Seq.filter (fun x -> 100 = List.sum x) |> Seq.toList |> printfn "%A"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment