TopCoder SRM 152 DIV 1 Medium 練習

問題

ちょっと変わった言語処理系実装してね。

言語仕様まで全部書くとめんどくさい。

ハイパーやるだけ。

最初MISMATCHの意味を取り違えてて色々なんかアレ。ソース汚物。

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

public class QuiningTopCoder {
    Stack<int> S = new Stack<int>();
    bool overflow = false;
    public int pop()
    {
        if (S.Count == 0)
            return 0;
        else
            return S.Pop();
    }

    public void push(int t) 
    {
        if (t < -1000000000 || t > 1000000000)
            overflow = true;
        S.Push(t);
    }

    public string testCode(string source) {
        int D = 1, IP = 0, N = source.Length, X = 0;
        string output = "";

        while (X <= 80000)
        {
            char o = source[IP];
            if ('0' <= o && o <= '9')
                S.Push(o - '0');
            else
                switch (o)
                {
                    case '$': pop(); break;
                    case ':':
                        int t = pop();
                        push(t); push(t);
                        break;
                    case 'W':
                        int A = pop(); int B = pop();
                        push(A); push(B);
                        break;
                    case ',':
                        int pos = Math.Abs(pop()) % N;
                        if (source[pos] != source[output.Length]) return "MISMATCH " + X;
                        output += source[pos];
                        break;
                    case '+': push(pop() + pop()); break;
                    case '-': push(pop() - pop()); break;
                    case '#': D *= 2; break;
                    case 'R': D *= -1; break;
                    case 'S': push((pop() > 0 ? 1 : -1)); break;
                    case '_': D = pop() % N; break;
                    case 'J': IP = Math.Abs(pop()) % N; break;
                    case '@':
                        if (output == source) return "QUINES " + X;
                        if (output.Length < source.Length) return "BADEND " + X;
                        else return "MISMATCH " + X;
                }
            if (overflow) return "OVERFLOW " + X;
            if (output == source) return "QUINES " + X;
            else if (output.Length == source.Length) return "MISMATCH " + X;
            if (o != 'J') IP = (3 * N + D + IP) % N;
            if (o == '#') D /= 2;
            ++X;
        }
        return "TIMEOUT";
    }
}