Problem:
ポケベル打ち

ある日、たろう君は、本文に「519345213244」という数字だけが書いてあるおかしなメールを受け取り
ました。そのメールは、10 歳年上の従姉からだったので電話して聞いてみると、「あ、急いでたから
ポケベル打ちで送っちゃった。便利よね。よろしくねっ!」といって切られてしまいました。いつも
せわしなく、少し強引なところのあるこの従姉をよく知るたろう君は、仕方なく自分で「ポケベル打
ち」について調べてみると、10 年ぐらい前に一世を風靡したかな入力の方法だということが分かりまし
た。

「ポケベル打ち」では、図 1 のような変換表に従い‘あ’は 11、‘お’は 15 という具合に、2 つの数字
で一つの文字を入力していきます。例えば「なると」という文字列を入力するには「519345」と打ちま
す。従って、どの文字も 2 つの数字で入力することができるのです。

図1

携帯電話がまだ広く普及していないころ、高校生はこの方法で公衆電話から友達のポケベルにメッセー
ジを送信していたのだそうです。猛烈なスピードでポケベル打ちができる女子高生もいたとか。最近、
仕事も忙しくなってきた従姉は、メールを無意識のうちにポケベル打ちでタイプするようになってしま
いました。

そこで、毎回解読に苦労しているたろう君を助けるために、ポケベル打ちによるメッセージを文字列
に変換し出力するプログラムを作成してください。ただし、変換には図2の変換表を使い、英
小文字及び、「.」、「?」、「!」、空白のみを対象とします。変換出来ない文字を含むメッセージに対しては NA と出力してください。

図2

Input

複数のメッセージが与えられます。各行に１つのメッセージ (200 文字以内) が与えられます。メッセージの総数は 50 を超えません。

Output

各メッセージに対して、変換後のメッセージまたは NA を１行に出力してください。

Sample Input

341143514535
314
143565553551655311343411652235654535651124615163
551544654451431564
4
3411
6363636363
153414

Output for the Sample Input

naruto
NA
do you wanna go to aizu?
yes sure!
NA
na
?????
end

Solution in C# (judge verdict: Accepted)

using System;
using System.Text;

class Program {
    static void Main() {
        for (string line; !string.IsNullOrEmpty(line = Console.ReadLine());)
        {
            Console.WriteLine(ConvertString(line));
        }
    }

    static string ConvertString(string line) {
        var length = line.Length;

        if (length % 2 != 0) {
            return "NA";
        }

        var result = new StringBuilder(length / 2);

        for (int i = 0; i < length; i += 2) {
            var ch = ConvertChar(line[i], line[i + 1]);

            if (ch == char.MinValue) {
                return "NA";
            }

            result.Append(ch);
        }

        return result.ToString();
    }

    static char[,] charTable = {
        { 'a', 'b', 'c', 'd', 'e' },
        { 'f', 'g', 'h', 'i', 'j' },
        { 'k', 'l', 'm', 'n', 'o' },
        { 'p', 'q', 'r', 's', 't' },
        { 'u', 'v', 'w', 'x', 'y' },
        { 'z', '.', '?', '!', ' ' },
    };

    static char ConvertChar(char v1, char v2) {
        int i, j;
        if (!int.TryParse(v1.ToString(), out i) || !int.TryParse(v2.ToString(), out j) ||
            i < 1 || i > 6 || j < 1 || j > 5
        ) {
            return char.MinValue;
        }

        return charTable[i - 1, j - 1];
    }
}