【深圳 IO 攻略】第 21 關(guān):精確食品秤

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

本關(guān)要求如下:
顯示器初始處于關(guān)閉狀態(tài)。
若在顯示器處于關(guān)閉狀態(tài)時(shí)按下按鈕,則打開(kāi)顯示器。然后,根據(jù)【重量】輸入的變化,不斷更新顯示值。題目保證只會(huì)在【重量】輸入為 0 時(shí)開(kāi)機(jī)。
若在顯示器顯示非 0 重量時(shí)按下按鈕,則將當(dāng)前的【重量】輸入視為【去皮重量】,顯示器顯示的實(shí)際重量歸零。
若在顯示器顯示 0 時(shí)按下按鈕,則發(fā)送 -999 關(guān)閉顯示器。題目保證只會(huì)在【重量】輸入為 0 時(shí)關(guān)機(jī)。例如,【重量】輸入和【去皮重量】都為 50 的情況下,實(shí)際顯示數(shù)值也為 0,但游戲不會(huì)給出“在這時(shí)候按下按鈕關(guān)機(jī)”的測(cè)試樣例。同時(shí),關(guān)機(jī)狀態(tài)下的【重量】輸入會(huì)一直為 0。
電路圖和代碼如下:


我們用 dat 來(lái)存儲(chǔ)【去皮重量】。因?yàn)椤救テぶ亓俊恐豢赡芎湍骋豢痰摹局亓俊枯斎胂嗟?,而【重量】輸入又是一個(gè) p 口輸入,所以“去皮重量”只可能位于?0~100 之間。因此,我們可以通過(guò)【將 dat 置為 0~100 范圍外的某個(gè)數(shù)】來(lái)表示【顯示器處于關(guān)機(jī)狀態(tài)】。這里我們選擇了 999,因?yàn)楫?dāng)關(guān)機(jī)時(shí)需要發(fā)送 -999,去皮重量是 999 時(shí),正好滿足 0 - 999 = -999。這樣我們發(fā)送給顯示器的數(shù)據(jù)就可以統(tǒng)一為“重量輸入減去去皮重量的值”,不需要額外的判斷了。
首先我們將【去皮重量】初始化為 999,表示顯示器初始處于關(guān)機(jī)狀態(tài)(@ mov 999 dat)。然后我們檢測(cè)是否有按鈕按下(tcp p0 0)。如果沒(méi)有按鈕按下,則關(guān)閉所有 + - 號(hào)的指令,跳過(guò)更新【去皮重量】的過(guò)程,直接跳到第 6 行輸出當(dāng)前的實(shí)際重量。當(dāng)有按鈕按下時(shí),我們需要更新【去皮重量】的值。這里我們分三種情況討論:
當(dāng)【去皮重量】為 999 時(shí),需要將電源打開(kāi)。由于開(kāi)機(jī)時(shí)的【重量】輸入一定為 0,所以此時(shí)我們需要將【去皮重量】置為 0。
開(kāi)機(jī)狀態(tài)下,當(dāng)【去皮重量】和實(shí)際的【重量】輸入不相等時(shí),我們?yōu)榱俗岋@示器歸零,需要將【去皮重量】置為當(dāng)前的【重量】值,確?!爸亓?- 去皮重量 = 0”。
開(kāi)機(jī)狀態(tài)下,當(dāng)【去皮重量】和實(shí)際的【重量】輸入一致時(shí),我們需要將【去皮重量】置為 999 以關(guān)機(jī)。
經(jīng)過(guò)分析可以發(fā)現(xiàn),第一條的“將【去皮重量】置為 0”等價(jià)于“將【去皮重量】置為當(dāng)前的【重量】值”。因此我們可以將三種情況合并為兩種情況:“當(dāng)【重量】和【去皮重量】不等時(shí)按下按鈕,更新【去皮重量】為當(dāng)前的【重量】值;當(dāng)【重量】和【去皮重量】相等時(shí)按下按鈕,更新【去皮重量】為 999。”。我們的第 3~5 行代碼描述的正是此邏輯(+ teq p1 dat, - mov p1 dat, + mov 999 dat)。
接下來(lái),無(wú)論是否更新了去皮重量,我們都要在這一秒內(nèi)給顯示器發(fā)送新的實(shí)際重量數(shù)值。首先我們將輸入的【重量】值放入 acc(mov p1 acc),然后減去【去皮重量】(sub dat)。計(jì)算出實(shí)際重量后,將該數(shù)值發(fā)送給顯示器(mov acc x3)。做完這些事情后,休眠一秒,進(jìn)入下一個(gè)時(shí)鐘周期繼續(xù)監(jiān)測(cè)(slp 1)。
點(diǎn)擊左下角的【模擬】,稍等片刻,便會(huì)彈出結(jié)算界面:
