Daily Programmer Challenge #235: Scoring a Bowling Game

My submission to: https://www.reddit.com/r/dailyprogrammer/comments/3ntsni/20151007_challenge_235_intermediate_scoring_a/

by pendensproditor

JavaScript

(function () {

    var parseGameStr = function (gameStr) {
            return gameStr.replace(/\s/g, '').split('');
        },

        rollToScore = function (roll, previousRoll) {
            if (!isNaN(roll)) {
                return parseInt(roll);
            }
            if (roll === 'X') {
                return 10;
            }
            if (roll === '/') {
                // Previous roll could be a gutter ball.
                return (isNaN(previousRoll) ? 10 : 10 - previousRoll);
            }
            return 0;
        },

        calculateScore = function (gameStr) {
            var rolls = parseGameStr(gameStr),
                score = 0;
            for (var i = 0, l = rolls.length; i < l; i++) {
                score += rollToScore(rolls[i], rolls[i - 1]);
                // Strike. Look ahead and add next two rolls.
                if (rolls[i] === 'X') {
                    score += rollToScore(rolls[i + 1]);
                    score += rollToScore(rolls[i + 2], rolls[i + 1]);
                    // If this is the first ball of the 10th frame, we're done.
                    if (i == l - 3) {
                        break;
                    }
                }
                // Spare. Look ahead and add next roll.
                else if (rolls[i] === '/') {
                    score += rollToScore(rolls[i + 1], rolls[i]);
                    // If this is the second ball of the 10th frame, we're done.
                    if (i == l - 2) {
                        break;
                    }
                }
            }
            return score;
        };

    console.log(300, calculateScore('X X X X X X X X X XXX'));

    console.log(137, calculateScore('X -/ X 5- 8/ 9- X 81 1- 4/X'));

    console.log(140, calculateScore('62 71  X 9- 8/  X  X 35 72 5/8'));

})();