Challenge
playit 型关卡,题面给出一段用作者自造语言写的 5 行程序,要求给出它的输出:
BEGIN notr.ealCREATE int AS 2DESTROY int AS 0ANS var AS Create + TOout TOSolution
-
BEGIN notr.eal只是程序头,notr.eal读作not real,这门语言本身是虚构的,没有任何公开语法可查。 -
CREATE、DESTROY、ANS、TO在这个语言里都只是普通标识符,是一组自指单词;它们的字面含义(创建 / 销毁 / 答案 / 到)是纯粹的误导。 -
以下是一种用于解释该短程序的假设,不是官方语言规范;未绑定标识符默认零、大小写归一化及
out TO的含义未由本地解释器自测证明。按该解释,语法骨架有三点:<标识符> <类型> AS <表达式>做声明赋值、+做整数加法、out做输出。 -
AS是赋值分隔符,int/var只是类型标注,不参与数值。 -
CREATE int AS 2:把2绑定到标识符CREATE。 -
DESTROY int AS 0:把0绑定到标识符DESTROY。 -
ANS var AS Create + TO:计算Create + TO。标识符归一化后Create就是第 2 行的CREATE(值为 2),TO从未被赋值、按未绑定标识符计 0,所以 。 -
out TO:out是输出语句,行尾的TO指出输出通道而不是变量,打印当前答案。
下面的最小解释器演示上述解释下的数值流,不是该语言的官方解释器,也不能单独证明平台语义:
import re
PROGRAM = "\n".join([ "BEGIN notr.eal", "CREATE int AS 2", "DESTROY int AS 0", "ANS var AS Create + TO", "out TO",])
def value_of(expr, env): total = 0 for term in expr.split("+"): term = term.strip() if re.fullmatch(r"\d+", term): total += int(term) else: total += env.get(term.lower(), 0) return total
def run(source): env = {} answer = None for line in source.splitlines(): parts = line.split() if not parts or parts[0] == "BEGIN": continue if parts[0] == "out": print("out %s -> %s" % (parts[1], answer)) continue name, declared_type, _as = parts[0], parts[1], parts[2] expr = " ".join(parts[3:]) answer = value_of(expr, env) env[name.lower()] = answer print("%-8s %-4s AS %-14s => %d" % (name, declared_type, expr, answer)) return answer
if __name__ == "__main__": print(run(PROGRAM))运行输出
CREATE int AS 2 => 2DESTROY int AS 0 => 0ANS var AS Create + TO => 2out TO -> 22