「fj夏令营」解释器
「题目描述」
小呆同学热爱计算机科学。
他最近对 Python 这种语言非常感兴趣,不仅希望学会怎么写 Python 的脚本,更希望
搞清楚 Python 的解释器是怎么实现的,他找到了你,希望你可以编写一个简单的 Python
解释器。
你被要求实现 Python 解释器中两种简单的功能:
语句类型 格式 解释
赋值语句 A = B
把 B 的值赋给 A,这里的 B 是一个合法的 Python 表
达式。
for example:
>>> a = 1 //a=1
>>> b = a + 100 //b=101
输出语句 print(A1[, A2, …])
输出 print 后括号中的每一个变量或者常量的值。每两
个值之间用一个空格隔开,整个语句处理完成后换行。
for example:
>>> a = 554 //a=554
>>> print(a, 11224)
554 11224
为了降低本问题的难度,特别约定:
• 变量名由大写字符构成 (’A’-’Z’),变量名的长度不超过 8。
• 表达式中只会出现 +, − 两种运算符,不会存在括号。
• 语句中不会出现空格。
• 赋值语句中等号右边的表达式只会包含变量,常量和上面提到的两种运算符。
• 在 Python 语言中默认是支持大整数运算的,为了简化问题,保证所有的常量都大于
0 且不大于 2
10 − 1。
• 保证出现在赋值语句等号右边的变量以及在输出语句中出现的变量都被赋值过。
• 中间过程及答案可能出现负数。
• 你不需要支持高精度运算,保证任何时候任何一个变量的值 −2
63 ∼ 2
63 − 1 的范围内。
「输入格式」
从 idle.in 中输入数据
每行一个语句,读完为止。
保证输入文件是一个合法的 Python 脚本文件,可以直接用 Python3.4 解释运行。
「输出格式」
输出到 idle.out 中
按照题目要求输出。
「样例输入」
TZK=26-867-267+339-797-646-466-446
PMFX=129
print(TZK,PMFX,840)
print(TZK,471,PMFX)
print(PMFX,PMFX,PMFX)
BLJTY=PMFX-255-PMFX+555+434
RUNGZPL=BLJTY-TZK-260
QHI=TZK-BLJTY-RUNGZPL+441-PMFX
GOAD=390-533+TZK+946
print(233,138)
print(912,GOAD,442)
「样例输出」
-3124 129 840
-3124 471 129
129 129 129
233 138
912 -2321 442
「数据规模与约定」
对于 100% 的数据保证:输入文件的长度不会超过 20000 行。
「题解」
这题简直丧病。。。哈希+模拟
不过我偷懒写了二分才70分。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
#include<iostream> #include<cstdio> #include<cmath> #include<iomanip> #include<cstring> #include<cstdlib> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int l,tot,top; string s[20005],ch; string a[100005],hash[100005]; ll b[100005]; string p=" print(",tmp; bool judp() { for(int i=1;i<=6;i++) if(ch[i]!=p[i])return 0; return 1; } int getint(string x) { int l=1,r=tot; while(l<=r) { int mid=(l+r)>>1; if(hash[mid]==x)return mid; else if(hash[mid]>x)r=mid-1; else l=mid+1; } } void print() { for(int i=7;i<=l;) { tmp=""; while(ch[i]!=',') { if(ch[i]>='0'&&ch[i]<='9') printf("%c",ch[i]); else if(ch[i]==')')break; else tmp+=ch[i]; i++; } if(tmp!="")printf("%I64d",b[getint(tmp)]); i++; printf(" "); } printf("\n"); } void solve() { ll sum=0;int num;tmp=""; int i=1; for(;;i++) { if(ch[i]=='=')break; else tmp+=ch[i]; } num=getint(tmp); ll x=0,f=1;tmp=""; for(;i<=l;) { while(i<=l) { if(ch[i]=='-')f=f*(-1); else if(ch[i]=='='||ch[i]=='+'){i++;continue;} else if(ch[i]>='0'&&ch[i]<='9') x=x*10+ch[i]-'0'; else tmp+=ch[i]; i++; if(ch[i]=='+'||ch[i]=='-'&&getint(tmp)!=0) { if(tmp!="")sum+=f*b[getint(tmp)]; else sum+=f*x; x=0,f=1;tmp=""; break; } } } if(tmp!="")sum+=f*b[getint(tmp)]; else sum+=f*x; b[num]=sum; } void pre() { for(int i=1;i<=l;i++) { tmp=""; while(ch[i]>='A'&&ch[i]<='Z') tmp+=ch[i],i++; if(tmp!=""&&tmp!="print")a[++top]=tmp; } } int main() { //freopen("idle.in","r",stdin); //freopen("idle.out","w",stdout); ios::sync_with_stdio(false); int n=1; while(cin>>s[n]){n++;} for(int i=1;i<n;i++) { ch=" "+s[i]; l=ch.length()-1; pre(); } sort(a+1,a+top+1); for(int i=1;i<=top;i++) if(a[i]!=a[i-1])hash[++tot]=a[i]; for(int i=1;i<n;i++) { ch=" "+s[i]; l=ch.length()-1; if(judp())print(); else solve(); } return 0; } |
为什么要HASH。。map一下不就好了。。
TAT
近距离膜拜hzwer