Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.11 KB | None | 0 0
  1. module Bowling
  2.  
  3. type RollResult = int
  4.  
  5. type FrameType = Strike | Spare | Open
  6.  
  7. type FrameResult = FrameType * int
  8.  
  9. type List<FrameResult> with
  10.   member this.TotalScore : GameScore = this |> List.map snd |> List.sum
  11.  
  12. type GameResult =
  13.   | IncompleteFrame of scored:List<FrameResult> * unscored:List<RollResult>
  14.   | IncompleteGame of scored:List<FrameResult>
  15.   | CompleteGame of scored:List<FrameResult> * late:List<RollResult>
  16.  
  17. let bowl =
  18.   let rec bowl' scored unscored
  19.    match unscored with
  20.    | 10 :: (b1 :: b2 :: _) as unscored                    -> unscored |> bowl' (Strike (10 + b1 + b2) :: scored)
  21.     | r1 :: r2 :: (b1 :: _) as unscored when r1 + r2 = 10  -> unscored |> bowl' (Spare (10 + b1) :: scored)      
  22.    | r1 :: r2 :: unscored              when r1 + r2 < 10  -> unscored |> bowl' (Open (r1 + r2) :: scored)        
  23.     | late      when resultSoFar.Length = 10 -> CompleteGame    (List.rev resultSoFar, late)
  24.     | unmatched when resultSoFar.Length < 10 -> IncompleteFrame (resultSoFar, unmatched)
  25.     | []                                     -> IncompleteGame  (resultSoFar)
  26.   bowl' []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement