4 people like it.
Like the snippet!
Coding Kata: Score a Bowling Game
Score a Bowling game. The game is represented as a list of integers.
A game of bowling consists of ten frames. In each frame, the bowler will have two chances to knock down as many pins as possible with his bowling ball. If a bowler is able to knock down all ten pins with the first ball, he is awarded a strike. If the bowler is able to knock down all 10 pins with the two balls of a frame, it is known as a spare. Bonus points are awarded for both of these, depending on what is scored in the next 2 balls (for a strike) or 1 ball (for a spare). If the bowler knocks down all 10 pins in the tenth frame, the bowler is allowed to throw 3 balls for that frame. This allows for a potential of 12 strikes in a single game, and a maximum score of 300 points, a perfect game.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
/// Bowling rules: http://en.wikipedia.org/wiki/Ten-pin_bowling
let score game =
let rec loop acc turn xs =
match turn, xs with
| 0, _ -> // game over
acc
| _, 10::(x::y::_ as xs) -> // Strike : 10 + pins down on the next two throws
loop (10 + x + y + acc) (turn - 1) xs
| _, x::y::(z::_ as xs) when x + y = 10 -> // Spare: 10 + pins down in the next throw
loop (10 + z + acc) (turn - 1) xs
| _, x::y::xs -> // open frame
loop (x + y + acc) (turn - 1) xs
| _ ->
failwith "Error in the score"
loop 0 10 game
let game1 = [10; 10; 10; 10; 10; 10; 10; 10; 10; 10; 10; 10] // Score: 300
// > score game1;;
// val it : int = 300
let game2 = [9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9] // Score: 190
// > score game2;;
// val it : int = 190
let game3 = [10; 1; 9; 1; 2; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 1; 9; 10] // Score: 120
// > score game3;;
// val it : int = 120
let game4 = [5; 2; 3; 4; 4; 2; 6; 1; 8; 0; 0; 9; 2; 7; 2; 3; 8; 1; 3; 3] // Score: 73
// > score game4;;
// val it : int = 73
|
val score : game:int list -> int
Full name: Script.score
Bowling rules: http://en.wikipedia.org/wiki/Ten-pin_bowling
val game : int list
val loop : (int -> int -> int list -> int)
val acc : int
val turn : int
val xs : int list
val x : int
val y : int
val z : int
val failwith : message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.failwith
val game1 : int list
Full name: Script.game1
val game2 : int list
Full name: Script.game2
val game3 : int list
Full name: Script.game3
val game4 : int list
Full name: Script.game4
More information