UOJ Logo Cyr的博客

博客

如何快速写掉未来程序改呢

2015-06-24 21:24:32 By Cyr
好吧我并不是想讲什么歪门邪道……
我是大家都不认识的蒟蒻(仰慕高端选手们),第一次写uoj blog还有点小激动呢。主要是A掉了未来程序改有点兴奋……
首先我想说:为什么你们都写辣么长!为什么你们都写辣么长!为什么你们都写辣么长!很重要所以说三遍。
一开始看到什么100k的代码我都傻了,做好了从20号一路写到NOI结束的准备……然而事实上不用100k也不用25k,10k就够?

然而10k代码我写了三天……果然我还是弱。http://uoj.ac/submission/20824

列举一下代码长度:
    文本分析——2k的字符串处理
    内存申请——2k够了?我只用了1.5k诶
    声明函数——记录每个函数的开始位置方便调用。五六行代码,算它0.5k。
    运算符——处理每一种运算符(包括=,return,putchar,<<,还有万恶的逗号),这个挺麻烦,2k。
    通用栈——说是通用栈其实就是符号栈加记录个大括号……我把函数栈交给了国家(直接用的系统栈)。加上内存管理,算2k好了。
    控制流——对for/while/if处理一下代码块的分布然后调用主解释器。1k?
    主解释器——运行一个函数/代码块,每个词用上面的方法处理。1k?
没有啦没有啦。你们看,算满了才10k嘛……

使用到的一些小技巧
    给每个常量一个地址,给每个运算的中间过程一个地址,然后所有的运算都传地址(一个运算就只要一行了)
    把单目运算补个0当双目运算,把所有函数也当做单目运算。又能少一些代码,囍
    给控制流写一个通用的代码块分析。本来都是差不多的东西啦

一些坑
    很多ac程序都没有处理的问题:if (A) if (B) C;else D;这种分层,数据没有体现啊……应该是if{if else}这样。
    除了第一个点以外所有数据的函数都只有一个参数,害的我以为都是这样然后只好最后硬加一个逗号运算qwq
        逗号留下了一堆谜团……比如A,B;的并列语句,return (putchar(32),0);返回后一项的情况……反正我都写了,囍
    别把return写成break……其实大概只有我这种傻逼能犯这种错……
总体还是很流畅的www

评论

SCaffrey
orz
wangyisong1996
膜膜膜
ruchiose
膜膜膜
TKD
跪烂了
matthew99
膜膜膜
vivym
跪烂了
wzj
orzorz
zxozxo
跪烂了
Xin_Time
orz++

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。