Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Bowling
- type RollResult = int
- type FrameType = Strike | Spare | Open
- type FrameResult = FrameType * int
- type List<FrameResult> with
- member this.TotalScore : GameScore = this |> List.map snd |> List.sum
- type GameResult =
- | IncompleteFrame of scored:List<FrameResult> * unscored:List<RollResult>
- | IncompleteGame of scored:List<FrameResult>
- | CompleteGame of scored:List<FrameResult> * late:List<RollResult>
- let bowl =
- let rec bowl' scored unscored
- match unscored with
- | 10 :: (b1 :: b2 :: _) as unscored -> unscored |> bowl' (Strike (10 + b1 + b2) :: scored)
- | r1 :: r2 :: (b1 :: _) as unscored when r1 + r2 = 10 -> unscored |> bowl' (Spare (10 + b1) :: scored)
- | r1 :: r2 :: unscored when r1 + r2 < 10 -> unscored |> bowl' (Open (r1 + r2) :: scored)
- | late when resultSoFar.Length = 10 -> CompleteGame (List.rev resultSoFar, late)
- | unmatched when resultSoFar.Length < 10 -> IncompleteFrame (resultSoFar, unmatched)
- | [] -> IncompleteGame (resultSoFar)
- bowl' []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement