Problem:
ボウリング

クラスのレクリエーションとしてボウリングを行うことになりました。参加者ごとの投球情報を入力とし、得点の高い順に成績情報を出力するプログラムを作成してください。なお、同点の場合は学籍番号の若い順に出力してください。ただし参加者は 3 名以上 40 名以下とし、1人当たり1ゲームずつ投球しているものとします。

ボウリングとは、プレイヤーに対して頂点を向けて正三角形に並べられた、10 本のピンをめがけてボールを転がし、ピンを倒すスポーツです。 1 回目の投球ですべて転倒した場合をストライクと言い、その投球のみで次のフレームに進みます。ストライクでない場合は、残ったピンをそのままにして 2 回目の投球を行います。2 回目の投球ですべて転倒した場合をスペアと言います。2 回目の投球終了後、次のフレームに進みます。

1 ゲームは 10 のフレームから構成され、第 1 から第 9 の各フレームは 2 回投球できます。各フレームの開始時点では、10 本のピンがすべて立った状態で用意されます。第 10 フレームは、ストライクもしくはスペアが出た場合には計 3 回の投球を、それ以外の場合は 2 回の投球を行い、ゲーム終了となります。

スコア例１

スコア例２（最高得点300点の場合）

スコア計算の方法

各フレームにおいてスペア、ストライクがない場合は、 2 回の投球で倒したピンの本数がそのフレームの得点となります。（スコア例１の第 4 フレームと第 8 フレーム）

スペアを出した場合、倒した本数である 10 点に加え、次の投球で倒したピンの本数がこのフレームの得点に加算されます。（スコア例１の第 1 フレームと第 2 フレームの関係など）スコア例１の第 1 フレームでは第 2 フレームの 1 投で倒した 10 本（点）を加えた 20 点が得点となります。第 3 フレームも同様の計算方法です。

ストライクを出した場合、倒した本数である 10 点に加え、続く 2 回の投球で倒したピンの本数が加算されます。（スコア例１の第 2 フレームと第 3 フレームの関係など）もちろん続く 2 投中にストライクの場合があります。（スコア例１の第 5 フレームと第 6、7 フレームの関係など）

第 10 フレームのみ、スペア、ストライクを出した場合、3 投して倒したピンの総数が第 10 フレームの得点として加算されます。

各フレームの得点の合計が 1 ゲームの得点となり、最高得点は 300 点となります。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

m
score1
score2
:
scorem

1行目に参加者数 m （3 ≤ m ≤ 40）、続くm 行にi 人目の参加者情報 scorei が与えられます。各参加者情報は１行ずつ次の形式で与えられます。

id s1 s2 ... sn

先頭に学籍番号id (0 ≤ id ≤ 9999)、続いて第 j 投の転倒ピン数 sj (0 ≤ sj ≤ 10) が与えられます。総投球数 n は、12 以上 21 以下であり、得点計算に必要なピン数が過不足なく与えられるものとします。

Output

入力データセットごとに、学籍番号と得点を、得点の高い順（同点の場合は学籍番号の若い順）に出力します。学籍番号と得点を１つの空白で区切って１行に出力してください。

Sample Input

3
1010 6 3 10 7 1 0 7 9 1 10 6 2 4 3 9 1 9 0
1200 5 3 9 1 7 1 0 0 8 1 10 10 4 3 9 1 8 2 9
1101 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4
3321 8 2 10 9 1 7 0 10 10 10 0 8 10 10 10 10
3332 5 0 10 9 1 4 1 9 0 10 10 7 1 5 2 8 1
3335 10 10 10 10 10 10 10 10 10 10 10 10
3340 8 2 7 3 6 4 8 2 8 2 9 1 7 3 6 4 8 2 9 1 7
0

Output for the Sample Input

1200 127
1010 123
1101 60
3335 300
3321 200
3340 175
3332 122

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11 {
    class Program {

        

        static void Main(string[] args) {
            new Program().solve();
        }

        void solve() {
            while (true) {
                int num_Player = int.Parse(Console.ReadLine());
                if (num_Player == 0) {
                    return;
                }
                List<ResultBowling> allResult = new List<ResultBowling>();
                for (int i = 0; i < num_Player; i++) {
                    ResultBowling result = new ResultBowling();
                    string input = Console.ReadLine();
                    string[] scoreCard = input.Split(' ');
                    result.calcScore(scoreCard);
                    allResult.Add(result);
                }
                
                allResult.Sort(delegate(ResultBowling a, ResultBowling b) {
                    if (b.totalScore != a.totalScore) return b.totalScore - a.totalScore;
                    else return a.playerNumber - b.playerNumber;
                });

                for (int i = 0; i < allResult.Count; i++) {
                    Console.WriteLine(allResult[i].playerNumber.ToString()+" "+allResult[i].totalScore.ToString());
                }
            }
        }

    }

    class ResultBowling {
        int[] scoreCard;
        public int playerNumber;
        public int totalScore;

        public void calcScore(string[] input) {
            playerNumber = int.Parse(input[0]);
            scoreCard = new int[input.Length - 1];
            for (int i = 0; i < scoreCard.Length; i++) {
                scoreCard[i] = int.Parse(input[i+1]);
            }

            Flame[] result = new Flame[10];
            for (int i = 0; i < result.Length; i++) {
                result[i] = new Flame();
            }

            bool inFrame = false;
            int flameCount = 0;
            int s = 0;
            while (true) {

                if (flameCount == 9) {
                    switch (scoreCard.Length - s) {
                        case 3:
                            result[flameCount].setScore(scoreCard[s],scoreCard[s+1],scoreCard[s+2]);
                            break;
                        case 2:
                            result[flameCount].setScore(scoreCard[s],scoreCard[s+1],0);
                            break;
                    }
                    break;
                }
                if (scoreCard[s] == 10) {
                    if (s > 1) {
                        if (inFrame) {
                            result[flameCount].setScore(0, scoreCard[s], 0);
                            flameCount++;
                            s++;
                        } else {
                            result[flameCount].setScore(scoreCard[s], 0, 0);
                            flameCount++;
                            s++;
                        }
                    } else {
                        result[flameCount].setScore(scoreCard[s], 0, 0);
                        flameCount++;
                        s++;
                    }
                } else {
                    if (!inFrame) { 
                        s++;
                        inFrame = true;
                    } else {
                        result[flameCount].setScore(scoreCard[s - 1], scoreCard[s], 0);
                        flameCount++;
                        s++;
                        inFrame = false;
                    }
                }
            }

            
            for (int f = 0; f < result.Length; f++) {
                if (f == 9) {
                    if (result[f - 2].getIsStrike() && result[f - 1].getIsStrike()) totalScore += 20 + result[f].getScore()[0];
                    if (result[f-1].getIsStrike()) {
                        totalScore += 10 + result[f].getScore()[0] + result[f].getScore()[1];
                    } else if(result[f-1].getIsSpare()) {
                        totalScore += 10 + result[f].getScore()[0];
                    }
                    totalScore += result[f].getScore()[0] + result[f].getScore()[1] + result[f].getScore()[2];
                } else if(f >= 2 && f < 9) {
                    if (result[f - 2].getIsStrike() && result[f - 1].getIsStrike()) { totalScore += 20 + result[f].getScore()[0]; }
                    if (result[f].getIsStrike()) {
                        if (result[f - 1].getIsSpare()) {
                            totalScore += 10 + result[f].getScore()[0];
                        }
                        continue; 
                    }
                    if (result[f - 1].getIsStrike()) {
                        totalScore += 10 + result[f].getScore()[0] + result[f].getScore()[1];
                    }
                    if (result[f - 1].getIsSpare()) {
                        totalScore += 10 + result[f].getScore()[0];
                    }
                    if (result[f].getIsSpare()) continue;
                    totalScore += result[f].getScore()[0] + result[f].getScore()[1];
                } else {
                    if (f > 0) {
                        if (result[f-1].getIsSpare()) {
                            totalScore += 10 + result[f].getScore()[0];
                        }
                        if (result[f - 1].getIsStrike() && !result[f].getIsStrike()) {
                            totalScore += 10 + result[f].getScore()[0] + result[f].getScore()[1];
                        }
                    }
                    if (result[f].getIsStrike()) continue; 
                    if (result[f].getIsSpare()) continue;
                    totalScore += result[f].getScore()[0] + result[f].getScore()[1];
                }
            }
        }

        class Flame {
            int first, second,third;
            bool isStrike, isSpare;
            public void setScore(int a,int b,int c) {
                first = a;
                second = b;
                third = c;
                if (a == 10) {
                    isStrike = true;
                    return;
                }
                if (a < 10 && a + b == 10) {
                    isSpare = true;
                    return;
                }
            }

            public int[] getScore() {
                return new int[] { first, second, third };
            }

            public bool getIsStrike() {
                return isStrike;
            }
            public bool getIsSpare() {
                return isSpare;
            }
        }
    }
    
}