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;
}