Problem:
覆面算

数式の一部を隠してしまって、隠した数字を探す問題を覆面算といいます。今回は、数式の中のある数字のいくつかを X で隠してしまった式を扱います。以下の数式を入力して、結果を出力するプログラムを作成してください。

数式

「数字列 + 数字列 = 数字列」の形で、1 行の単純な足し算式です。

「数字列」は、数字 0 から 9 と文字 X の並びです。

2 桁以上の「数字列」の左端の数字は 0 ではないものとします。

X は、数式全体の中で必ず 1 つ以上含まれます。

結果

覆面算の答えです。数式が成り立つ様な X の値で 0 ~ 9 のどれか 1 つです。2 つ以上の答えはないものとします。

答えがない場合、結果は“NA”としてください。

Input

複数のデータセットが与えられます。各データセットとして、X を 1 つ以上含む足し算式(空白を含まない 126 文字以内の文字列) が１行に与えられます。データセットの数は 150 を超えません。

Output

各データセットについて、覆面算の結果を１行に出力してください。数字 0 ~ 9 または NA を出力してください。

Sample Input

123+4X6=X79
12X+4X6=X79
XX22+89=X2XX

Output for the Sample Input

5
NA
1

Solution in C# (judge verdict: Accepted)

using System;

public class Hello
{
    public static void Main()
    {
        string line;
        for (; (line = Console.ReadLine()) != null;)
        {
            int ans;
            string[] a = line.Trim().Split('+', '=');
            if ((a[0].StartsWith("X") && a[0].Length >= 2) |
                (a[1].StartsWith("X") && a[1].Length >= 2) |
                (a[2].StartsWith("X") && a[2].Length >= 2)) ans = check(a, 1);
            else ans = check(a, 0);
            Console.WriteLine(ans == -1 ? "NA" : ans.ToString());
        }
    }
    public static int check(string[] a, int ooz)
    {
        for (int i = ooz; i <= 9; i++)
        {
            var a1 = a[0].Replace("X", i.ToString());
            var a2 = a[1].Replace("X", i.ToString());
            var a3 = a[2].Replace("X", i.ToString());
            if (getPlus(a1, a2) == a3) return i;
        }
        return -1;
    }
    public static string getPlus(string a1, string a2)
    {
        var b1 = new int[126]; var b2 = new int[126]; var b3 = new int[126];
        var imax = Math.Max(a1.Length, a2.Length);
        var j = 0; var k = 0;
        for (int i = imax - a1.Length; i < imax; i++) b1[i] = int.Parse(a1[j++].ToString());
        for (int i = imax - a2.Length; i < imax; i++) b2[i] = int.Parse(a2[k++].ToString());
        for (int i = imax-1; i >=1; i--)
        {
            b3[i] += (b1[i] + b2[i]) % 10;
            b2[i - 1] += (b1[i] + b2[i]) / 10;
        }
        b3[0] += b1[0] + b2[0];
        var ret = "";
        for (int i = 0; i < imax; i++)
            ret += b3[i].ToString();
        return ret;
    }
}