Problem:
ランレングス

文字列が連続した場合、ある規則で文字を置き換え文字列を短くすることができます。たとえば、AAAA という文字列の場合、@4A と表現すれば 1 文字分圧縮されます。この規則で圧縮された文字列を入力してもとの文字列に復元するプログラムを作成してください。ただし、復元した文字列に＠文字は出現しないものとします。

また、原文の文字列は英大文字、英小文字、数字、記号であり 100 文字以内、連続する文字は 9 文字以内です。

入力

複数の文字列が与えられます。１行に１つの文字列が与えられます。文字列の数は 50 を超えません。

出力

文字列ごとに、各文字に対して復元した文字列を１行に出力して下さい。

Sample Input

ab@5C1@8050
@99+1=1@90

Output for the Sample Input

abCCCCC10000000050
999999999+1=1000000000

Solution in C# (judge verdict: Accepted)

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

namespace _0077
{
    class Program
    {
        static void Main(string[] args)
        {
            var codedLetters = ReadData();
            var decodedLetters = DecodeRunLength(codedLetters);
            WriteData(decodedLetters);

        }

        static List<string> DecodeRunLength(List<string> codedLetters) 
        {
            var decodedLetters = new List<string>();
            foreach (var codedLetter in codedLetters)
            {
                var decodedLetter = "";
                var codedCharactors = codedLetter.ToCharArray();
                for (int i = 0; i<codedLetter.Count() ;i++ )
                {
                    if (codedCharactors[i] == '@')
                    {
                        int codedLength = (int)Char.GetNumericValue(codedCharactors[i + 1]);
                        for (int j = 0; j < codedLength; j++)
                        {
                            decodedLetter += codedCharactors[i + 2];
                        }
                        i += 2;
                    }
                    else 
                    {
                        decodedLetter += codedCharactors[i];
                    }
                }
                decodedLetters.Add(decodedLetter);
            }
            return decodedLetters;
        }

        /// <summary>
        /// データを読み込む
        /// </summary>
        /// <returns>読み込んだ入力群</returns>
        static List<string> ReadData()
        {
            var inputs = new List<string>();

            while (true)
            {
                var input = Console.ReadLine();
                if (string.IsNullOrEmpty(input))
                {
                    break;
                }
                inputs.Add(input);
            }
            return inputs;
        }

        /// <summary>
        /// データを書き出す
        /// </summary>
        /// <param name="outputs">書き出す出力群</param>
        static void WriteData(List<string> outputs)
        {
            foreach (var output in outputs)
            {
                Console.WriteLine(output);
            }
        }
    }
}