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.Collections.Generic;
using System.Linq;
using System.Text;

namespace _0127
{
    public class Program

    {
        public static void Main(string[] args)
        {

            char[,] letter = new char[,]
            {
                {'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','.','?','!',' '}
            };

            while (true)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line)) break;

                if (line.Length % 2 != 0)
                {
                    Console.WriteLine("NA");
                    continue;
                }

                string ans = "";
                bool flg = false;
                for (int i = 0 ; i < line.Length ; i += 2)
                {
                    int c1 = int.Parse(line[i].ToString());
                    int c2 = int.Parse(line[i + 1].ToString());

                    if (c1 < 1 || c1 > 6 || c2 < 1 || c2 > 5)
                    {
                        flg = true;
                        break;
                    }
                    ans += letter[c1 - 1, c2 - 1];
                }
                Console.WriteLine(flg ? "NA" : ans);
            }
        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}