转跳到内容

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


推荐贴

10 小时前, 北冥有鱼1573 说道:

真的做起来之后了更多的问题……rd运算符真的很不好搞

比方说,r1d6*r1d6是

  1. (r1d6) * (r1d6),掷两枚六面骰子的结果相乘
  2. r1d(6 * r1d6),先掷一枚6面骰子结果为x,然后掷另一枚6x面骰子

两者中的哪个?

两种掷法结果必然是不一样的,前面一种方法没办法得到大于6的素数,而后一种可以

我本来想说这里有一个文法二义性的问题来着,后来拿antlr4跑了一遍发现其实没有

因为运算符rd的优先级没有运算符*高,所以*会先算,因此实际运算是2

附一个生成的文法树:

antlr4_parse_tree.png.993ca907f8b6e6e8a8ce2d5410ed0e21.png

 

链接到点评
10 小时前, 北冥有鱼1573 说道:

其实我遇到的最大的问题是,使用栈计算表达式时,d运算符的优先级最低,因此四则运算先被算好,roll点会在最后从右到左计算(从右到左是因为栈后进先出,表达式最右边的最先出来)

因此当遇到像r(r1d6)d20这样的嵌套roll点时,需要先算外层的r x d20,这就没法继续算了……

这就是为啥我要设置一个运算符rd(笑

:huaji2:没错,就是为了给标准的表达式求值板子制造困难

链接到点评
于 2020/5/6 于 AM12点55分, 北冥有鱼1573 说道:

其实我遇到的最大的问题是,使用栈计算表达式时,d运算符的优先级最低,因此四则运算先被算好,roll点会在最后从右到左计算(从右到左是因为栈后进先出,表达式最右边的最先出来)

因此当遇到像r(r1d6)d20这样的嵌套roll点时,需要先算外层的r x d20,这就没法继续算了……

(r1d6)都被括号括起来了你扫到)的时候应该弹栈了

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

重要消息

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