トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.222 引き算と足し算

■■■問題■■■

真っ当な人間は、文字列 "x+y" をx+yとして解釈して、文字列"x-y"をx-yとして解釈するだろう。
ところが、アリスは足し算と引き算を逆に認識している。
つまり、文字列 "x+y"をx-yとして解釈して、文字列"x-y"をx+yとして解釈する。

入力された文字列に対して、アリスの解釈での演算の結果を出力してください。

■■■入力■■■

xopy

-10000 <= x <= 10000
opは、"+"または"-"
-10000 <= y <= 10000

x,yは整数で、先頭には符号(+,-)が付く場合があります。
(例えば、整数が0の場合は+0,-0,0の3通りの入力が考えられます。
 整数が1の場合は+1,1の2通りの入力が考えられます。
 整数が-1の場合は-1の1通りの入力が考えられます。)

x,op,yの間には空白が含まれないことに注意してください。

■■■出力■■■

出力の値を一行で出力してください。 最後に改行してください。


C#のソース

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("5+3");
            //2
            //入力は5+3ですが、5 - 3の演算の結果である2を出力します。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("10-20");
            //30
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("-2+-3");
            //1
            //入力のx,yが符号を含む場合があります。
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        Match InsMatch = Regex.Match(InputList[0], @"([-+]?[0-9]+)([-+])([-+]?[0-9]+)$");
        int X = int.Parse(InsMatch.Groups[1].Value);
        string Ope = InsMatch.Groups[2].Value;
        int Y = int.Parse(InsMatch.Groups[3].Value);

        if (Ope == "+") Console.WriteLine(X - Y);
        else Console.WriteLine(X + Y);
    }
}


解説

正規表現で数式を解析してから、
演算子を入れ替えてます。