【TIS-100 攻略】TIS-NET 第 22 關(guān):信號(hào)指數(shù)放大器

本文首發(fā)于 B 站《TIS-100》文集(https://www.bilibili.com/read/readlist/rl626023)。原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處。
TIS-NET 第 22 關(guān)《信號(hào)指數(shù)放大器》(Signal Exponentiator)關(guān)卡展示

本關(guān)要求輸出 A 的 B 次方的值。題目保證 A 和 B 不為 0,且輸出的值在 1~999 范圍內(nèi)。
TIS-100 里只有加法和減法指令,本來做乘法和除法就已經(jīng)夠麻煩了,現(xiàn)在還要更進(jìn)一步,做冪運(yùn)算。A 的 B 次方相當(dāng)于 B 個(gè) A 相乘,相當(dāng)于?A 后面接了 B-1 個(gè)【×A】。那么問題就迎刃而解了:首先令 ans = A,然后每做一次 ans×A 的計(jì)算,就將計(jì)算結(jié)果覆蓋到 ans 上。這樣的乘法運(yùn)算做 B-1 次后,即可得出答案。
本關(guān)的代碼如下:

IN.A 下方的節(jié)點(diǎn)將本輪的 A 匯總到右邊(mov up right)。
IN.B 下方的節(jié)點(diǎn)將 A 放到 acc 里(mov left acc),將 B 放到 bak 里(swp, mov up acc, swp)。接下來給下方發(fā)送 B 次 A 后(mov acc down, swp, sub 1, jnz 4),發(fā)送一個(gè)表示終止信號(hào)的 0(mov 0 down)。
中央節(jié)點(diǎn)純傳話(mov up down)。
下方的兩個(gè)節(jié)點(diǎn)相互配合,計(jì)算 A 的 B 次方的值。從上方收到第一個(gè) A 時(shí),將它作為 ans,存入 bak?中(mov up acc, swp)。接下來,上方還會(huì)發(fā)送 B-1 次 A,和一個(gè) 0。將收到的值存入 acc(mov up acc)。若收到的是 A,則按順序執(zhí)行;若收到的是 0,則跳到第 13 行執(zhí)行(jez d)。收到的是 A 值時(shí),我們需要計(jì)算 ans×A 的值,因此將 bak 里的 ans 向左下角節(jié)點(diǎn)發(fā)送 A 次,左下角節(jié)點(diǎn)首先會(huì)將 acc 置為 -999,然后加上?A 個(gè) ans,得到?-999+ans×A 的值(swp, mov acc left, swp, sub 1, jnz 5)。發(fā)送完 A 次 ans 后,發(fā)送一個(gè) 999(mov 999 left),讓左下角的 acc 由負(fù)數(shù)變?yōu)檎龜?shù),這樣左下角就會(huì)停止累加過程,將 ans×A 的計(jì)算結(jié)果發(fā)給我們。我們將本次計(jì)算結(jié)果覆蓋到 ans 上(mov left acc),然后跳回第 2 行(jmp 2),接著從上方接收剩下的 A。直到從上方接收到 0 后,跳到第 13 行,輸出最終的 ans(swp, mov acc down)。
左下角的節(jié)點(diǎn)不多說,初始值設(shè)為 -999,然后一直從右邊接收累加量,只要右邊發(fā)的一直是 ans,就一直累加(mov -999 acc, add right, jlz 2)。當(dāng)右邊發(fā)完 A 次 ans 后,會(huì)突然發(fā)一個(gè) 999 過來,我們的 acc 也會(huì)突然變成正數(shù)。此時(shí)停止累加,將 ans×A 的計(jì)算結(jié)果發(fā)給右方,準(zhǔn)備進(jìn)行下一次計(jì)算(mov acc right)。如此反復(fù),計(jì)算 B-1 次 ans=ans×A 后,即可得出本次的答案。
點(diǎn)擊左下角的【RUN】,稍等片刻,便會(huì)彈出結(jié)算界面:
