Sha256: 800721d76fc4f79fcc3655afe6bfec9d2219daa0c4ef75d4c3b3e2d5cd5e92e9

Contents?: true

Size: 1.69 KB

Versions: 156

Compression:

Stored size: 1.69 KB

Contents

module Bowling

let map2 f opt1 opt2 = 
    match opt1, opt2 with
    | Some x, Some y -> Some (f x y)
    | _ -> None

let numberOfFrames = 10
let maximumFrameScore = 10
let minimumFrameScore = 0

let newGame() = Some []

let validatePins pins = 
    if pins < minimumFrameScore || pins > maximumFrameScore then 
        None 
    else 
        Some pins

let isStrike pins = pins = maximumFrameScore
let isSpare pins1 pins2 = pins1 + pins2 = maximumFrameScore

let roll pins rolls = map2 (fun rolls pins -> rolls @ [pins]) rolls (validatePins pins)

let rec scoreRolls totalScore frame rolls = 
    let isLastFrame = frame = numberOfFrames
    let gameFinished = frame = numberOfFrames + 1

    let scoreStrike remainder = 
        match remainder with
        | x::y::zs when isLastFrame ->
            if x + y > 10 && x <> 10 then None
            else scoreRolls (totalScore + 10 + x + y) (frame + 1) zs
        | x::y::zs ->
            scoreRolls (totalScore + 10 + x + y) (frame + 1) (x::y::zs)
        | _ ->
            None

    let scoreSpare x y remainder = 
        match remainder with 
        | z::zs->
            scoreRolls (totalScore + x + y + z) (frame + 1) (if isLastFrame then zs else z::zs)
        | _ ->
            None
            
    let scoreNormal x y remainder =
        match validatePins (x + y) with
        | Some z -> scoreRolls (totalScore + z) (frame + 1) remainder
        | None -> None

    match rolls with
    | [] -> if gameFinished then Some totalScore else None
    | x::xs when isStrike x -> scoreStrike xs        
    | x::y::ys when isSpare x y -> scoreSpare x y ys        
    | x::y::zs -> scoreNormal x y zs       
    | _ -> None
    
let score = Option.bind (scoreRolls 0 1)

Version data entries

156 entries across 156 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.179 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.178 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.177 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.176 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.175 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.174 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.173 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.172 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.171 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.170 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.169 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.167 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.166 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.165 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.164 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.163 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.162 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.161 tracks/fsharp/exercises/bowling/Example.fs
trackler-2.2.1.160 tracks/fsharp/exercises/bowling/Example.fs