Sha256: 73079f3ad920100c05853ba4ce67d3dfcc95897d9a44ff3f78be9675e78ef651

Contents?: true

Size: 1.38 KB

Versions: 317

Compression:

Stored size: 1.38 KB

Contents

module Wordy

open System
open System.Text.RegularExpressions

type Operation = int -> int
type Equation = int * (Operation list)

let equationRegex = new Regex(@"(?<left>-?\d+) (?<operation>-?plus|minus|divided by|multiplied by) (?=(?<right>-?\d+))", RegexOptions.Compiled)

let regexGroupStr (group: string) (m: Match) = m.Groups.[group].Value
let regexGroupNumber (group: string) (m: Match) = regexGroupStr group m |> int

let calculate (left, operations) = List.fold (fun acc item -> item acc) left operations

let parseRight (m: Match) = regexGroupNumber "right" m

let parseOperand (m: Match) = 
    match regexGroupStr "operation" m with
    | "plus"          -> (+)
    | "minus"         -> (-)
    | "multiplied by" -> (*)
    | "divided by"    -> (/)
    | _ -> failwith "Unknown operation"

let parseOperation (m: Match) =
    fun x -> (parseOperand m) x (parseRight m)

let parseOperations (matches: MatchCollection) =
    matches 
    |> Seq.cast<Match> 
    |> Seq.map parseOperation
    |> Seq.toList

let parseLeft (matches: MatchCollection) = 
    matches 
    |> Seq.cast 
    |> Seq.head 
    |> regexGroupNumber "left" 

let parse (question: string): Equation option =
    match equationRegex.Matches question with
    | m when m.Count = 0 -> None
    | m -> Some (parseLeft m, parseOperations m)

let solve (question: string): int option =  
    question 
    |> parse 
    |> Option.map calculate

Version data entries

317 entries across 317 versions & 1 rubygems

Version Path
trackler-2.0.6.41 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.40 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.39 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.38 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.37 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.36 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.35 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.34 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.33 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.32 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.31 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.30 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.29 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.28 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.27 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.26 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.25 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.24 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.23 tracks/fsharp/exercises/wordy/Example.fs
trackler-2.0.6.22 tracks/fsharp/exercises/wordy/Example.fs