最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【深圳 IO 攻略】阿瓦隆城第 9 關:細胞支架模型

2022-07-08 20:03 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉(zhuǎn)載請注明出處。

關卡展示

本關的【數(shù)據(jù)】輸入會不定期地發(fā)送一些數(shù)據(jù)包。有時是由 6 位數(shù)字組成的數(shù)據(jù)包,收到它后需要控制右側(cè)的 3D 打印機打出一個 6x6 的矩陣模型;有時只有一個 -1,收到它后需要控制 3D 打印機回到原點。具體打印的內(nèi)容我們需要參照數(shù)據(jù)手冊:

本數(shù)據(jù)手冊有一處印刷錯誤,第 4 行最后的英文字母 y 應該改為希臘字母 ψ。

我們每從【數(shù)據(jù)】輸入端口中收到一個 0~8 的數(shù)字時,就需要對照著以上表格打印出矩陣的一行。而且,為了節(jié)約時間,打印機按照 Z 字形移動,也就是:打印第奇數(shù)行時,打印機從左到右移動;打印第偶數(shù)行時,打印機從右到左移動。而不是像打字機一樣,每到新的一行,就回到最左邊。下面的動圖演示了打印機在收到 214426 這個數(shù)據(jù)包后的工作過程:

  • 電機初始位于 (0, 0) 處;

  • 收到第一個數(shù)字 2 時,對照數(shù)據(jù)表里的行 2,從左到右打印六個 β(青綠色),然后電機上移一格,此時電機位于 (1, 5) 處;

  • 收到第二個數(shù)字 1 時,對照數(shù)據(jù)表里的行 1,從右到左打印六個 α(梅紅色),然后電機上移一格。此時電機位于 (2, 0) 處;

  • 收到第三個數(shù)字 4 時,對照數(shù)據(jù)表里的行 4,從左到右依次打印?ψ(蛋黃色)、α(梅紅色)α(梅紅色)、ψ(蛋黃色)、α(梅紅色)、ψ(蛋黃色),然后電機上移一格。此時電機位于 (3, 5) 處;

  • 收到第四個數(shù)字 4 時,對照數(shù)據(jù)表里的行 4,從右到左依次打印?ψ(蛋黃色)、α(梅紅色)ψ(蛋黃色)、α(梅紅色)、α(梅紅色)、ψ(蛋黃色),然后電機上移一格。此時電機位于 (4, 0) 處;

  • 收到第五個數(shù)字 2 時,對照數(shù)據(jù)表里的行 2,從左到右打印六個?β(青綠色),然后電機上移一格,此時電機位于 (5, 5) 處;

  • 收到第六個數(shù)字 6 時,對照數(shù)據(jù)表里的行 6,從右到左依次打印 ψ(蛋黃色)、空白、ψ(淡黃色)、空白空白、ψ(蛋黃色),然后電機上移一格。此時電機位于 (6, 0) 處;

  • 收到最后的 -1 時,電機向下移動 6 格,回到原點 (0, 0)。

本關需要 6 塊芯片分工合作!電路圖如下:

首先看最靠左的芯片。它是唯一和【數(shù)據(jù)】輸入相連接的芯片,因此它是 1 號芯片。我們首先寫它的代碼:

收到行號后(slx x1),將收到的行號 ×2 后(mov x1 acc, add acc)給中間的 2 號芯片,以及右邊控制電機移動的 4、5 號芯片各發(fā)一份(mov acc x0, mov acc x2, mov acc x3)。做完這些后,休眠 6 秒(slp 6)。至于為什么要將數(shù)字 ×2,以及為什么要休眠 6 秒,我們后面再說。

然后我們看位于正中央的,記錄行號和電機實時 X 坐標的 2 號芯片的代碼:

收到廣播信號后(slx x1),將擴大 2 倍后的行號同步到 p0 口中供下方的 3 號芯片使用(mov x1 p0)。然后開始計算電機的實時 X 坐標。我們說過,電機既可能從左向右移動,也可能從右向左移動。電機的移動方向取決于移動前的初始 X 坐標。初始坐標為 0 時,本行的 X 從 0 移動到 5,是從左向右移動的模式;初始坐標為 5 時,本行的 X 從 5 移動到 0,是從右向左移動的模式。所以我們首先判斷初始 X 坐標的值是 0 還是 5(tgt acc 2),對應地激活 + - 中的一個代碼塊。

初始 X 坐標是 0 時,激活 - 號代碼塊,采用從左向右移動的模式:將當前 X 坐標發(fā)給 3 號芯片(mov acc x2),睡一秒后(slp 1)檢查 X 是否小于?5(- tcp acc 5)。小于 5 時令 acc +1(- add 1),并跳到第 4 行繼續(xù)給 3 號芯片發(fā)坐標(- jmp 4),直到 X = 5 為止,關閉一切 + - 號指令,跳回到第 1 行等待下一行的任務。

初始 X 坐標是 5 時,激活 + 號代碼塊,采用從右向左移動的模式:將當前?X 坐標發(fā)給 3 號芯片(mov acc x2),睡一秒后(slp 1)檢查 X 是否大于?0(+?tcp acc?0)。大于 0?時令 acc -1(+ sub 1),并跳到第 4 行繼續(xù)給 3 號芯片發(fā)坐標(+ jmp 4),直到 X = 0?為止,關閉一切 + - 號指令,跳回到第 1 行等待下一行的任務。

2 號芯片是一個純工具芯片,它僅僅在為 3 號芯片提供行號和 X 坐標的數(shù)據(jù)。

下面來看位于左下方的,隨時查詢待打印細胞的 3 號芯片的代碼:

現(xiàn)在是時候解釋為什么 1 號芯片收到行號后要將它 ×2 了。

數(shù)據(jù)手冊里提供了 9 種細胞模型,行號為 0~8。如果我們一位數(shù)一位數(shù)地存儲,那要存 6×9=54 個數(shù)字,要四塊 ROM 才放得下!而我們的線路板面積只有這么點大,根本沒有空間放得下四塊 ROM;即使勉強放得下,也沒法和這么多 ROM 同時進行通訊。因此我們必須要使用壓縮的方式來存儲,比如用三位數(shù)來存儲連續(xù)的三種材料,這樣一個細胞模型用 2 格 ROM 空間,共 6 位數(shù),占用空間就小得多了。

做了這樣的狀態(tài)壓縮后,9 種細胞模型需要 2×9=18 個數(shù)字,一塊 ROM 還是放不下。但我們觀察數(shù)據(jù)手冊發(fā)現(xiàn):

前 3 行的 6 格內(nèi)容都是一樣的,這樣一來前 3 行完全沒必要往 ROM 里存,只存剩下的 6 格內(nèi)容就好。至此,剩下的 6 種細胞模型就只占用了 2×6=12 個數(shù)字,終于可以完美地放在一塊 ROM 里了。

1 號芯片之所以要將行號 ×2,是因為(除前 3 行外的)每一行的細胞模型都需要占用兩格 ROM 空間來存儲。如果將 6 位數(shù)存在【行號】開頭的兩格 ROM 空間里,那么相鄰行之間會有沖突。只有將 6 位數(shù)存在【行號 ×2】開頭的兩格 ROM 空間里時,才能解決相鄰行之間的位置沖突。1 號芯片將行號 ×2 后,本質(zhì)上是將【行號】轉(zhuǎn)換成了【ROM 地址】。3 號芯片需要的正是后者。

此時我們來觀察一下 ROM:

第 0~2 行的細胞模型并沒有存儲在 ROM 中,我們需要從第 3 行(即 6 號地址空間)開始看。第 3 行對應的地址 6、7 存儲的是 424242?這樣的六位數(shù),在數(shù)據(jù)表里對應著 αβαβαβ 的細胞模型。看到這,你可能會想當然地以為 4 是?α, 2 是 β。但我要告訴你,不是的。我們接著往下看:第 4 行對應的地址 8、9 存儲的是 626226?這樣的六位數(shù),在數(shù)據(jù)表里對應著 ψααψαψ 的細胞模型。

這里你可能會覺得奇怪了,2?到底對應誰,怎么跟三種希臘字母都對應了?其實,這里一行細胞模型的每一格,是跟一個六位數(shù)【從低位到高位】的順序一一對應的。因為,字符串和數(shù)字是兩個完全不同的物種,字符串的第 0 個字符是最左邊的那個字符,而數(shù)字的第 0 位卻是最右邊的那個數(shù)字。就連 dgt 指令,也是 0 表示個位,1 表示十位,2 表示百位,從低到高的順序。因此,我們將細胞模型的希臘字母串轉(zhuǎn)換成六位數(shù)后,讀取的順序也要跟著變?yōu)閺牡臀坏礁呶蛔x取。對于?ψααψαψ 這個模型來說,它的第 0 個字符是最左邊的 ψ;對于 626226 這個六位數(shù)來說,它的第 0 位是最右邊的 6。

現(xiàn)在我們從低位開始重新讀一下這個六位數(shù):個位的 6 對應 ψ,十位的 2 對應 α,百位的 2 對應 α,千位的 6 對應 ψ,萬位的 2 對應 α,十萬位的 6 對應 ψ。然后,我們回到第 3 行,從低位開始重新讀:個位的 2 對應 α,十位的 4 對應 β,百位的 2 對應 α,千位的 4 對應 β,萬位的 2 對應 α,十萬位的 4 對應 β。完美對應,毫無沖突。

讀完整個 ROM 后,我們會發(fā)現(xiàn):ROM 中的 0 對應空白,2 對應 α,4 對應 β,6 對應 ψ

再來看芯片代碼:

擴大 2 倍后的行號在 3 號芯片被喚醒前,已經(jīng)被 2 號芯片同步到了自己的 p1 口上。2 號芯片通過 x 口傳來的是實時的 X 坐標,收到它后將它放入 acc 寄存(slx x3, mov x3 acc)。這時候我們要檢查,當前要打印的細胞模型是否為前 3 行(tcp p1 5)。由于 p1 是擴大 2 倍后的行號,所以當 p1 為 0、2、4 中的一個(即 <5)時,直接將這個數(shù)字和一個 0 發(fā)送給右邊的芯片(- mov p1 x2, - mov 0 x2, - jmp 1)。后面我會詳細解釋這兩個數(shù)字的作用。

要打印的不是前 3 行的細胞模型時,我們先將 p1 中的數(shù)置為 ROM 地址(mov p1 x1),然后檢查電機的 X 坐標是在 0~2 范圍內(nèi)還是 3~5 范圍內(nèi)(tgt acc 2)。如果是在 0~2 范圍內(nèi),那我們要讀取的是低三位中的一位數(shù)字,此時我們要空讀一格 ROM,讓 ROM 指針停在低三位的格子里(- mov x0 null);如果是在 3~5 范圍內(nèi),那我們要讀取的是高三位中的一位數(shù)字,ROM 指針初始已經(jīng)指向了高三位,此時我們需要將 acc 減去 3,讓其變成 0~2,令將來的取位指令 dgt 生效(+ sub 3)。做完這些后,我們將取得的高三位/低三位數(shù),以及要取出的位數(shù),都發(fā)給右邊的 6 號芯片,令它打印出對應的細胞(mov x0 x2, mov acc x2)。

現(xiàn)在回過頭來看第 3~6?行。當要打印的細胞模型位于前 3 行時,我們發(fā)現(xiàn)要打印的細胞正好是六個 p1,即第 0 行的細胞模型是空空空空空空(000000),第 1 行的細胞模型是 αααααα(222222),第 2 行的細胞模型是 ββββββ(444444)。那么,打印這些行的細胞模型時,我們只需要不停地叫 6 號芯片打印 p1 這個“三位數(shù)”(000/002/004)的個位(0/2/4)就行了,不需要關心電機的 X 走到哪了。這也就是滿足前面的條件時,我們發(fā)給 6 號芯片的兩個數(shù)字分別是 p1 和 0 的原因(- mov p1 x0, - mov 0 x0)。

接下來是控制電機移動和閥門開關的 4~6 號芯片的代碼:

現(xiàn)在該解釋為什么 1 號芯片每發(fā)一個數(shù)字就要睡眠 6 秒了。因為從收到第一個數(shù)字起,每隔 6 秒,X 的運動方向改變一次,Y 向上移動一格。所以控制電機 X、Y 的 4、5 號芯片,以及用于記錄電機實時 X 坐標的 2 號芯片,都只能 6 秒鐘接收一格數(shù)據(jù),表示進入了新的一行。在此期間接收會導致線程阻塞。

4 號芯片用來控制電機的水平移動,其?acc 寄存器用于記錄電機的水平移動方向,和電機 X?輸出端口的電平信號一致,0 表示向左移動,100 表示向右移動。首先將電平信號初始化為 50(mov 50 p1),然后等待 1 號芯片的信號(slx x0)。如果 1 號芯片發(fā)送的是非負數(shù)(tcp x0 -1),表明需要令電機打印一行新的細胞,此時改變電機的水平移動方向,并將新的方向值發(fā)送給發(fā)送給電機 X 輸出端口(+ not, + mov acc p1)。然后,睡眠 5 秒,表示向左/向右移動 5 格(+ slp 5),此時電機已經(jīng)從一端移動到了另一端,此時需要令電機停止水平移動(mov 50 p1, slx x0)。而如果 1 號芯片發(fā)送的是負數(shù)(-1 × 2 = -2),則表明電機需要由 (0, 5) 退回至 (0, 0)。此時因為不需要在 X 方向上移動,所以什么操作都不需要執(zhí)行,跳回開頭繼續(xù)等待下一次信號就好(mov 50 p1, slx x0)。

5 號芯片用來控制電機的垂直移動。首先將電平信號初始化為 50(mov 50 p1),然后等待 1 號芯片的信號(slx x0)。如果 1 號芯片發(fā)送的是非負數(shù)(tcp x0 -1),表明需要令電機打印一行新的細胞,此時垂直方向上先等待 5 秒(slp 5),等到水平方向移動到另一個端點后,令電機在 Y 方向上上移一格(+ mov 100 p1, slp 1)。而如果 1 號芯片發(fā)送的是負數(shù)(-1 × 2 = -2),則表明電機需要由 (0, 5) 退回至 (0, 0)。此時令電機在 Y 方向上下移 6 格,回到原點(- mov 0 p1, slp 5, slp 1)。移動完畢后,令電機停止垂直移動(mov 50 p1, slx x0)。

最后是 6 號用于控制三個閥的芯片。收到 3 號芯片發(fā)來的三位數(shù)和要提取的位數(shù)后(slx x0),我們將三位數(shù)放入 acc(mov x0 acc),并將要提取的位數(shù)放入 dgt 指令中,提取出對應位的數(shù)字(dgt x0)。此時我們獲得的一位數(shù)就是本秒要打印的細胞,0 對應,2 對應 α,4 對應 β,6 對應 ψ。首先判斷是不是(tcp acc 0)。如果是的話,本秒什么都不用打印,關閉一切 + - 號指令,直接跳到最后睡覺。然后是一個典型的“三態(tài)判定”,先假設要打印的是 β,激活 DX-300 的第二路信號(+ mov 10 x3),然后開始“三態(tài)判定”,檢查要打印的是不是另兩種細胞(+ tcp acc 4)。如果要打印的是編號為 2 的 α,則撤銷之前的設置,改為激活 DX-300 的第一路信號(- mov 100 x3);如果要打印的是編號為 6 的 ψ,同樣撤銷之前的設置,改為激活 DX-300 的第三路信號(+ mov 1 x3)。信號設置完畢后,休眠一秒,讓信號生效(slp 1)。生效一秒后,需要立刻將 DX-300 的信號清除(mov 0 x3)。

點擊左下角的【模擬】,稍等片刻,便會彈出結(jié)算界面:


【深圳 IO 攻略】阿瓦隆城第 9 關:細胞支架模型的評論 (共 條)

分享到微博請遵守國家法律
平度市| 麦盖提县| 寻乌县| 禹州市| 繁峙县| 罗山县| 浦城县| 仁寿县| 潢川县| 榆社县| 新干县| 全州县| 吉安县| 宜春市| 广水市| 孟连| 仙居县| 临潭县| 福清市| 湾仔区| 涞水县| 阳高县| 萝北县| 永春县| 临桂县| 华亭县| 岳普湖县| 呼图壁县| 天祝| 香港 | 和林格尔县| 偏关县| 阿拉善盟| 台中市| 长泰县| 抚松县| 云龙县| 金门县| 福州市| 东乌珠穆沁旗| 南江县|