Problem:
0 から 9 までの数字だけで構成された文字列が与えられたとき,その文字列から次の規則に従って新しい文字列を作る操作を考える.与えられた文字列を左端から1文字ずつ順に読んで行き,同じ数字 a が r 個続いていた場合,個数 r と数字a を空白で区切らずにこの順で書き出す.与えられた文字列の右端まで読み,最後の書き出しが終わったところまでを途中何回書き出しがあったとしても全部まとめて操作1回とカウントする.2回目以降の操作は前回の操作により書き出された文字列を与えられた文字列として同様の操作を実施する.例えば “122244” という文字列が与えられた場合には左端から順に1個の1, 3個の2,2個の4なのでこの操作1回で得られる文字列は “113224” であり,“44444444444” (11 個の4)の場合には得られる文字列は “114” となる.

100 文字以下の与えられた文字列に上の操作を n 回実施した文字列を出力するプログラムを作成せよ.ただし, n ≤ 20 とする.

入力データ は 2 行からなり,1 行目に操作回数 n, 2 行目に最初の文字列が書かれている.

入力例

5

11

　

出力例

13112221

入力

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

出力

データセットごとに、指定された回数の操作を施した文字列 を１行に出力する．

入力例

5
11
5
11
0

出力例

13112221
13112221

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

Solution in C# (judge verdict: Accepted)

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

namespace AOJ0506String
{
    class Program
    {
        static void Main(string[] args)
        {
            var inputDataSets = GetInputData();

            var operatedStrings = OperateStrings(inputDataSets);

            OutputStrings(operatedStrings);
        }

        private static IEnumerable<DataSet> GetInputData()
        {
            var dataSets = new List<DataSet>();
            int operationCount;
            string initialString;

            while(true)
            {
                operationCount = int.Parse(Console.ReadLine());
                if(operationCount == 0)
                {
                    break;
                }

                initialString = Console.ReadLine();
                dataSets.Add(new DataSet(operationCount, initialString));
            }

            return dataSets;
        }

        private static IEnumerable<string> OperateStrings(IEnumerable<DataSet> inputDataSets)
        {
            var operatedStrings = new List<string>();

            foreach (var inputDataSet in inputDataSets)
            {
                var temporaryString = inputDataSet.InitialString;

                for (var i = 0; i < inputDataSet.OperationCount; ++i)
                {
                    temporaryString = OperateString(temporaryString);
                }

                operatedStrings.Add(temporaryString);
            }

            return operatedStrings;
        }

        private static string OperateString(string givenString)
        {
            var operatedString = new StringBuilder();

            const int continuousCountInitialValue = 0;
            var continuousCount = continuousCountInitialValue;
            var previousLetter = givenString.First();

            foreach (var currentLetter in givenString)
            {
                if (!currentLetter.Equals(previousLetter))
                {
                    WriteOutToOperatedString(operatedString, continuousCount, previousLetter);
                    continuousCount = continuousCountInitialValue;
                }

                previousLetter = currentLetter;
                ++continuousCount;
            }

            WriteOutToOperatedString(operatedString, continuousCount, previousLetter);

            return operatedString.ToString();
        }

        private static void WriteOutToOperatedString(StringBuilder operatedString, int continuousCount, char previousLetter)
        {
            operatedString.Append(continuousCount);
            operatedString.Append(previousLetter);
        }

        private static void OutputStrings(IEnumerable<string> operatedStrings)
        {
            foreach (var operatedString in operatedStrings)
            {
                Console.WriteLine(operatedString);
            }
        }

        public class DataSet
        {
            public int OperationCount { get; private set; }
            public string InitialString { get; private set; }

            public DataSet(int operationCount, string initialString)
            {
                this.OperationCount = operationCount;
                this.InitialString = initialString;
            }
        }
    }
}