【TIS-100 攻略】隱藏關(guān)

本文首發(fā)于 B 站《TIS-100》文集(https://www.bilibili.com/read/readlist/rl626023)。原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處。
翻到數(shù)據(jù)手冊(cè)的倒數(shù)第二頁,我們注意到數(shù)據(jù)手冊(cè)上有這么一句話加上了額外的標(biāo)記:

按下 F2 鍵可查看防篡改證書。當(dāng)我們?cè)谥i題列表里按下 F2 后,屏幕顯示如下:

然后點(diǎn)擊右邊的鷹,即可順利進(jìn)入隱藏關(guān)卡。
隱藏關(guān)卡里的題目變成了亂碼,所以我們需要自己找出輸入量和輸出量間的規(guī)律:

其中一種猜想是:OUT.R 是 IN 除以 25 的值,向下取整。OUT.E 則表示?OUT.R?中的重復(fù)數(shù)字以及重復(fù)次數(shù):[4, 2] 表示連續(xù) 4 個(gè) 2,[7, 0] 表示連續(xù) 7 個(gè) 0,依此類推。
那么,本關(guān)的算法如下:
計(jì)算 IN 除以 25 并向下取整的值,輸出到 OUT.R。
收到第一個(gè)值時(shí),將長度計(jì)數(shù)器置為 1。
從第二個(gè)值開始,若新值 = 舊值,則令長度計(jì)數(shù)器 +1;若新值 ≠ 舊值,則向 OUT.E 依次輸出長度和舊值,并將長度計(jì)數(shù)器重置為 1。
代碼如下:

上方節(jié)點(diǎn)和中央節(jié)點(diǎn)配合計(jì)算 in/25 的值。先看上方節(jié)點(diǎn):
上方節(jié)點(diǎn)可能從 in 收到一個(gè)正數(shù),也可能收到序列末端的 -1(mov up acc)。
當(dāng)收到的是 -1 時(shí),跳到最后一行,直接向下發(fā)送 1 信號(hào)(jlz 6, mov 1?down)。
當(dāng)收到的不是 -1 時(shí),每將 in 減去一次 25(sub 25),
就向下發(fā)送一次 -1 信號(hào)(mov -1 down),
并判定:如果仍是正數(shù),則跳回第 3 行繼續(xù)減(jgz 3),
直到減到負(fù)數(shù)后,向下發(fā)送 1 信號(hào)(mov 1 down)。
再看中央節(jié)點(diǎn):
中央節(jié)點(diǎn)來計(jì)算本次 IN/25 的商。初值設(shè)置為 -1(mov -2 acc)
(add 1)
然后聽從上方節(jié)點(diǎn)的命令(jro up)。上方每將 in 減去一次 25,就會(huì)給我們發(fā)送一次 -1 信號(hào),我們向前跳 1 行,將商加上 1(add 1)。
上方將 in 減到負(fù)數(shù)后,會(huì)發(fā)給我們一次 1 信號(hào),我們將算好的商(mov acc down)
向下發(fā)兩次(mov acc down)。
左下角的節(jié)點(diǎn)用來檢查本次的 R 和上次的 R 是否一致,并向下輸出本次的 R:
上方會(huì)將每個(gè) R 都發(fā)兩遍,對(duì)于第一個(gè) R,我們沒有舊 R 可以比較,所以對(duì)于兩次發(fā)送的首 R,我們必須要丟棄一個(gè)(mov up acc),
然后接收第二個(gè)(mov up acc),
將其送往輸出口后,給右邊發(fā)送一個(gè) -1 信號(hào)(mov -1 right)。
從第二個(gè) R 開始,我們要將每個(gè)新 R 和 acc 里的舊 R 做差值運(yùn)算(sav)
(sub up)并判定:
如果差值是 0,說明新 R 和舊 R 相等,我們跳回第 2 行,將新 R 放入 acc 后輸出,給右邊發(fā)送 -1 信號(hào)(jez 2, mov up acc, mov acc down, mov -1 right);
如果差值不為 0,說明新 R 和舊 R 不相等,我們給右邊發(fā)送 1 信號(hào)(mov 1 right),
然后將舊 R 一并發(fā)給右邊(swp)
(mov acc right)
最后跳回第 2 行,將新 R 放入 acc 后輸出,給右邊發(fā)送 -1 信號(hào)(jmp 2, mov up acc, mov acc down, mov -1 right)。
右下角的節(jié)點(diǎn)首先將計(jì)數(shù)器清零(mov -1 acc, add 1),然后聽從左邊節(jié)點(diǎn)的命令:
收到首 R 時(shí),左邊節(jié)點(diǎn)會(huì)發(fā)來 -1 命令,此時(shí)向上跳 1 行,將計(jì)數(shù)器置為?1(add 1);
收到和舊 R 一致的新 R 時(shí),左邊節(jié)點(diǎn)也會(huì)發(fā)來 -1 命令,此時(shí)向上跳 1 行,將計(jì)數(shù)器加 1(add 1);
收到和舊 R 不一致的新 R 時(shí),左邊節(jié)點(diǎn)會(huì)發(fā)來 1 命令,此時(shí)向下跳 1 行,將計(jì)數(shù)器輸出給 OUT.E,同時(shí)把左邊發(fā)來的舊 R 也輸出給 OUT.E(mov acc down, mov left down),然后將計(jì)數(shù)器清零(mov -1 acc, add 1, jro left)。之后,左邊節(jié)點(diǎn)還會(huì)再發(fā)來一個(gè) -1 命令,我們向上跳 1 行,將計(jì)數(shù)器置為 1(add 1)。
點(diǎn)擊左下角的【RUN】,稍等片刻,屏幕上會(huì)彈出一個(gè)對(duì)話框。至此你就完成了 TIS-100 游戲里的所有關(guān)卡,解鎖了最終的 ILLEGAL EAGLE 成就(Find and solve the hidden puzzle,發(fā)現(xiàn)并解出隱藏關(guān)卡)。恭喜通關(guān)!
