欢迎光临散文网 会员登陆 & 注册

【TIS-100 攻略】TIS-NET 第 22 关:信号指数放大器

2022-11-14 13:00 作者:ココアお姉ちゃん  | 我要投稿

本文首发于 B 站《TIS-100》文集(https://www.bilibili.com/read/readlist/rl626023)。原创不易,转载请注明出处。

TIS-NET 第 22 关《信号指数放大器》(Signal Exponentiator)关卡展示

本关要求输出 A 的 B 次方的值。题目保证 A 和 B 不为 0,且输出的值在 1~999 范围内。

TIS-100 里只有加法和减法指令,本来做乘法和除法就已经够麻烦了,现在还要更进一步,做幂运算。A 的 B 次方相当于 B 个 A 相乘,相当于 A 后面接了 B-1 个【×A】。那么问题就迎刃而解了:首先令 ans = A,然后每做一次 ans×A 的计算,就将计算结果覆盖到 ans 上。这样的乘法运算做 B-1 次后,即可得出答案。

本关的代码如下:

IN.A 下方的节点将本轮的 A 汇总到右边(mov up right)。

IN.B 下方的节点将 A 放到 acc 里(mov left acc),将 B 放到 bak 里(swp, mov up acc, swp)。接下来给下方发送 B 次 A 后(mov acc down, swp, sub 1, jnz 4),发送一个表示终止信号的 0(mov 0 down)。

中央节点纯传话(mov up down)。

下方的两个节点相互配合,计算 A 的 B 次方的值。从上方收到第一个 A 时,将它作为 ans,存入 bak 中(mov up acc, swp)。接下来,上方还会发送 B-1 次 A,和一个 0。将收到的值存入 acc(mov up acc)。若收到的是 A,则按顺序执行;若收到的是 0,则跳到第 13 行执行(jez d)。收到的是 A 值时,我们需要计算 ans×A 的值,因此将 bak 里的 ans 向左下角节点发送 A 次,左下角节点首先会将 acc 置为 -999,然后加上 A 个 ans,得到 -999+ans×A 的值(swp, mov acc left, swp, sub 1, jnz 5)。发送完 A 次 ans 后,发送一个 999(mov 999 left),让左下角的 acc 由负数变为正数,这样左下角就会停止累加过程,将 ans×A 的计算结果发给我们。我们将本次计算结果覆盖到 ans 上(mov left acc),然后跳回第 2 行(jmp 2),接着从上方接收剩下的 A。直到从上方接收到 0 后,跳到第 13 行,输出最终的 ans(swp, mov acc down)。

左下角的节点不多说,初始值设为 -999,然后一直从右边接收累加量,只要右边发的一直是 ans,就一直累加(mov -999 acc, add right, jlz 2)。当右边发完 A 次 ans 后,会突然发一个 999 过来,我们的 acc 也会突然变成正数。此时停止累加,将 ans×A 的计算结果发给右方,准备进行下一次计算(mov acc right)。如此反复,计算 B-1 次 ans=ans×A 后,即可得出本次的答案。

点击左下角的【RUN】,稍等片刻,便会弹出结算界面:


【TIS-100 攻略】TIS-NET 第 22 关:信号指数放大器的评论 (共 条)

分享到微博请遵守国家法律