Codeforces Surprise Language Round #7 通关指南

Surprise Language Round #7用的语言是false,有关这门语言的资料可以在这场比赛的Announcement里找到链接。false的神奇之处在于它的编译器(解释器?)大小仅有数K,代价就是这门语言用起来蛋疼无比,写代码就像是在开垦荒地一样,什么都要自己写……好不容易把这场比赛8个题全都做完,于是决定写一个通关指南,来纪念这个挺有意思的语言。

读入整数

用false写hello world无比轻松,于是你就想写一个A+B……然而,false并不支持读入整数,只支持读入一个字符……但这显然难不倒会写读入优化的我。

[$'01->'[email protected]>&]d:  { isdigit() }
[^$d;!$[\'[email protected]*+r;!\]?~[%]?]r:  { readint() }
 
0r;!x:  { input x }

如何写函数

写到这里,觉得有必要分享一下用false写一个函数的方法。我认为需要保证的一点原则是不要改动参数。false程序基于堆栈,这就需要时刻对当前栈中有哪些元素保持了解,尤其是它并不支持交换任意两个元素,保持栈中元素有序便显得尤为重要。我一般在写一个函数时,会将它的参数列表写在草稿纸上,例如读入整数的函数:

last_x -> last_x ch -> last_x ch - '0' -> 
ch - '0' last_x * 10 -> 
x = (last_x * 10 + (ch - '0'))

这便完成一个完整的循环。

如何写循环

其实false写循环很容易,但我一开始以为变量不能多次赋值,就把迭代器直接扔到栈里面去了,每次都要算好久……其实只要像一般程序一样开个变量叫i,每次+1之类的就行了……

有关数组

false的文档里提供了一个嵌入汇编的方法来使用数组,但是cf提供的解释器好像不支持……但是false有一个神奇的函数(功能?)叫做ø(在cf的解释器里它被替换成了大写O),作用是把栈中第x个元素复制出来,那么栈就基本上可以当做数组用了,只不过它不支持修改元素……还有一种实现数组的方法是直接用26个字母来当数组的每一位(当然只适用于数组元素很少的情况),然后……写个程序生成一下你的false代码……如果数组大小不满26的话可以在对应的变量中放入-1之类的占位符。