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"; } }