转跳到内容

每 日 算 法 挑 战 (大嘘)【第0x15期】


推荐贴

第21期来啦!本题是接着第20期继续出的一道题,所以本题要连着20期的题干一起读。

第21期 冰系魔法2b

各位已经见过了基本款的魔法骰子。实际上,魔法骰子还有更多改进款,支持很多更为复杂的功能。之前说的异世界来客就有这么一款骰子,她向我们展示了这个骰子的用法。

这个骰子依然可以像前一款那样计算表达式。它一次可以顺序处理多个掷骰表达式,每个掷骰表达式都需要用分号;结尾。同时,这个骰子还支持流程控制(不愧是魔法师的骰子),就是if,while和for语句。同时,多个语句还可以用大括号括起来,成为一个语法上的整体。它们的语法也不复杂,上例子:

r1d6;
if (r1d6-3)
{
    while(r1d6-3) 15;
    (r3d20)*(r1d6);
}
else
    for(r1d6)
        if(r12d10-60)
            1+1;
r2d6;
for (5)
{
    r1d2;
}

我们的异世界来客是个冰元素使,这个魔法骰子的语法和她魔法咒语的语法很接近,所以她很喜欢这个骰子。唯一美中不足的是,这个骰子没有判断输入是否合法的能力。如果输入了不正确的掷骰程序,魔法骰子就可能坏掉。因此,她打算编制一个魔法,可以预先判断输入是不是合法的。

输入

一段魔法骰子的输入程序。

输出

如果输入程序合法,就输出一行OK,否则输出一行Fail

样例输入

r1d6;if (r1d6-3){while(r1d6-3) 15; (r3d20)*(r1d6);}else for(r1d6) if(r12d10-60) 1+1;r2d6;for (5){ r1d2;}

样例输出

OK

读到这里的朋友,是不是觉得这个题里魔法骰子的语法似曾相识?没错,这个语法是有意仿照C语言函数定义的部分来编制的。把rd运算符改成别的C语言运算符之后,甚至可以在C语言里跑起来(当然,要放在某个函数的函数体里才行,而且后面要加上return)。其实C语言的语法没那么难,不是么?

另外,总觉得今天这道题,非相关专业的学生应该不太好答出来了……那么,如果觉得自己不太会答这个题,那么可以试试ANTLR4.

微型召唤阵: @yhz012

,由Mr.K 018修改
链接到点评
6 分钟前, yhz012 说道:

我这是被钦定了吗,瑟瑟发抖

:goutou:没错,你已经在名单(指参与者名单)里了

这个题其实跟上一期是同一道题,区别无非是语法的复杂程度不同

当然,这并不意味着这个题是个表达式求值(

,由Mr.K 018修改
链接到点评
17 分钟前, Mr.K 018 说道:

:goutou:没错,你已经在名单(指参与者名单)里了

这个题其实跟上一期是同一道题,区别无非是语法的复杂程度不同

当然,这并不意味着这个题是个表达式求值(

:mx005:上一题我可以绕开有限状态机,纯靠栈来写,这个我大概是真的绕不开了吧……

另外至少把上一期的参与者也拉来啊(x不能只有我一个人面对恐惧(x

@北冥有鱼1573

,由yhz012修改
链接到点评
1 小时前, 北冥有鱼1573 说道:

我是谁我在哪:mx001:

不懂编译原理啊……但是光是做检查的话,先用分割成一个个语句,分别检查每个语句合法性,再检查大括号匹配,说不定能成?可惜我接下来几天应该没空搞这个了

没事,不懂编译原理就用ANTLR硬上:goutou:

Mr.K 018穿越到里区后,遇见了一只九尾狐狸,完成了她交付的汉化任务后被抚摸。4节操

链接到点评
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款