Problem:
A と B の 2 人のプレーヤーが， 0 から 9 までの数字が書かれたカードを使ってゲームを行う．最初に， 2 人は与えられた n 枚ずつのカードを，裏向きにして横一列に並べる．その後， 2 人は各自の左から 1 枚ずつカードを表向きにしていき，書かれた数字が大きい方のカードの持ち主が，その 2 枚のカードを取る．このとき，その 2 枚のカードに書かれた数字の合計が，カードを取ったプレーヤーの得点となるものとする．ただし，開いた 2 枚のカードに同じ数字が書かれているときには，引き分けとし，各プレーヤーが自分のカードを 1 枚ずつ取るものとする．

例えば， A，B の持ち札が，以下の入力例 1 から 3 のように並べられている場合を考えよう．ただし，入力ファイルは n + 1 行からなり， 1 行目には各プレーヤのカード枚数 n が書かれており， i + 1 行目（i = 1，2，... ，n）には A の左から i 枚目のカードの数字と B の左から i 枚目の カードの数字が，空白を区切り文字としてこの順で書かれている．すなわち，入力ファイルの 2 行目以降は，左側の列が A のカードの並びを，右側の列が B のカードの並びを，それぞれ表している．このとき，ゲーム終了後の A と B の得点は，それぞれ，対応する出力例に示したものとなる．

　入力ファイルに対応するゲームが終了したときの A の得点と B の得点を，この順に空白を区切り文字として 1 行に出力するプログラムを作成しなさい．ただし， n ≤ 10000 とする．

入力例１

入力例２

入力例３

3

3

3

9 1

9 1

9 1

5 4

5 4

5 5

0 8

1 0

1 8

　

出力例１

出力例２

出力例３

19 8

20 0

15 14

入力

入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、A の得点と B の得点を１行に出力する．

入力例

3
9 1
5 4
0 8
3
9 1
5 4
1 0
3
9 1
5 5
1 8
0

出力例

19 8
20 0
15 14

各データセットの出力の後（Bの得点の後）に改行を入れること。

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AOJ.Volume5
{
    static class CardGame
    {
        public static void Main()
        {
            Solve(int.Parse(System.Console.ReadLine()));
        }
        static Func<Func<T, F, T>, T> FoldLeft<T, F>(this IEnumerable<F> ien, T init)
        {
            return new Func<Func<T, F, T>, T>(func =>
            {
                foreach (var i in ien) {
                    init = func(init, i);
                }
                return init;
            }
            );
        }
        static void Solve(int n)
        {
            if (n != 0)
            {
                var score = new int[n].Select(x => System.Console.ReadLine().Trim().Split(' ').Select(_ => int.Parse(_)).ToArray()).FoldLeft(new int[] { 0, 0 })((init, ien) =>
                {
                    return (ien.First() == ien.Last()) ? new int[] { init[0] + ien.First(), init[1] + ien.Last() } : ((ien.First() < ien.Last()) ? new int[] { init[0], init[1] + ien.First() + ien.Last() } : new int[] { init[0] + ien.First() + ien.Last(), init[1] });
                });
                System.Console.WriteLine(score[0].ToString() + ' ' + score[1].ToString());
                Solve(int.Parse(System.Console.ReadLine()));
            }
        }
    }
}