Spoiler -Here is my solution

My solution is similar to Ben’s solution. with a couple of differences. I handled the frame differently. I like Ben’s solution a bit better as it doesn’t require different variables. I also used indexes instead of turns and everything was a lookahead. I started like Ben but changed it as I’m a little OCD and wanted everything looking in the same direction.

public static List<int> ScoreFrames(List<int> turnScores) {
	List<int> frameScores = new List<int>();
	int totalTurns = turnScores.Count;

	int idx = 0;
	int currentFrame = 1;
	while (idx < totalTurns) {
		if (turnScores[idx] == MAX_PINS) {
			// Handle Strike.
			if ((idx + 2) >= totalTurns) break;
			frameScores.Add(turnScores[idx] + turnScores[idx + 1] + turnScores[idx + 2]);
			if (currentFrame == LAST_FRAME) break;
			++idx;
		} else {
			if ((idx + 1) >= totalTurns) break;
			if ((turnScores[idx] + turnScores[idx + 1]) == MAX_PINS) {
				// Handle Spare.
				if ((idx + 2) >= totalTurns) break;
				frameScores.Add(turnScores[idx] + turnScores[idx + 1] + turnScores[idx + 2]);
			} else {
				// Handle Open Frames.
				frameScores.Add(turnScores[idx] + turnScores[idx + 1]);
			}
			idx += 2;
		}
		++currentFrame;
	}

	return frameScores;
}

Privacy & Terms