ETH官方钱包

切換
舊版
前往
大廳
主題

ZeroJudge - a459: An Easy Language 解題心得

Not In My Back Yard | 2020-09-07 00:00:02 | 巴幣 2 | 人氣 174

題目連結(jié):


題目大意:
輸入給定將本題之符號(hào)替換後的 Brainfuck 語言之語句,每個(gè)語句之間由多個(gè)空白或是換行字元隔開。

Brainfuck 參見維基頁面。其程式語言只由八種符號(hào)組成並各自等價(jià) C 語言之語句:
「>」,等價(jià) ++ptr;
「<」,等價(jià) --ptr;
「+」,等價(jià) ++(*ptr);
「-」,等價(jià) --(*ptr);
「.」,等價(jià) putchar(*ptr);
「,」,等價(jià) *ptr = getchar();
「[」,等價(jià) while (*ptr) {
「]」,等價(jià) }
其中 ptr 之型態(tài)為 char * ;對(duì)於本題是指向一字元陣列 brain[240],並初始化為 ptr = brain (即指向陣列開頭,brain[] 的初始化皆為 0)。

而本題將上述的符號(hào)做了額外的替換,對(duì)照表如下為:
「>」,對(duì)應(yīng)「(>OwO)>u~(/OwO)/nya~」
「<」,對(duì)應(yīng)「(>OwO)>u~!!(/OwO)/nya~!!」
「+」,對(duì)應(yīng)「(>OwO)>u~!(/OwO)/nya~!」
「-」,對(duì)應(yīng)「(>OwO)>u~!!!(/OwO)/nya~!!!」
「.」,對(duì)應(yīng)「Let's\(OwO)/nya~」
「,」,對(duì)應(yīng)「cosmic!」
「[」,對(duì)應(yīng)「CHAOS CHAOS!」
「]」,對(duì)應(yīng)「I WANNA CHAOS!」

本題無「cosmic!」,也就是「,」,之語句。請(qǐng)輸出給定的輸入語句會(huì)輸出的內(nèi)容。



範(fàn)例輸入:
(>OwO)>u~(/OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~(/OwO)/nya~ (>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
Let's\(OwO)/nya~ (>OwO)>u~(/OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~(/OwO)/nya~
(>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!! (>OwO)>u~!(/OwO)/nya~!
Let's\(OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
Let's\(OwO)/nya~ Let's\(OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! Let's\(OwO)/nya~ CHAOS CHAOS! (>OwO)>u~!!!(/OwO)/nya~!!!
I WANNA CHAOS! (>OwO)>u~(/OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~(/OwO)/nya~ (>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
Let's\(OwO)/nya~ (>OwO)>u~(/OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~(/OwO)/nya~ (>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
Let's\(OwO)/nya~ (>OwO)>u~(/OwO)/nya~ (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~(/OwO)/nya~
(>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!! Let's\(OwO)/nya~
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! Let's\(OwO)/nya~
(>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!!
(>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! Let's\(OwO)/nya~ (>OwO)>u~!!!(/OwO)/nya~!!!
(>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!!
(>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! (>OwO)>u~!!!(/OwO)/nya~!!! Let's\(OwO)/nya~
CHAOS CHAOS! (>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~(/OwO)/nya~
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
CHAOS CHAOS! (>OwO)>u~!!(/OwO)/nya~!! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~(/OwO)/nya~ (>OwO)>u~!!!(/OwO)/nya~!!!
I WANNA CHAOS! (>OwO)>u~!!(/OwO)/nya~!! (>OwO)>u~!(/OwO)/nya~! Let's\(OwO)/nya~
CHAOS CHAOS! (>OwO)>u~!!!(/OwO)/nya~!!! I WANNA CHAOS! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~! (>OwO)>u~!(/OwO)/nya~!
(>OwO)>u~!(/OwO)/nya~! Let's\(OwO)/nya~


範(fàn)例輸出:
Hello World!


解題思維:
簡單來說,我們要使用一種程式語言去編譯另一種程式語言。



我們可以先分析輸入的語句,將其轉(zhuǎn)成簡單的符號(hào)表示(數(shù)字或是單一字元)。將其存成一個(gè)轉(zhuǎn)換後的陣列(轉(zhuǎn)換並非必要,但是存成陣列這件事是為了之後方便)。

接著就從第一個(gè)語句開始執(zhí)行。那些等價(jià)於 ++ptr 、 --ptr 、 ++(*ptr) 、 --(*ptr) 、 putchar(*ptr) 之語句應(yīng)該沒有什麼問題,就是直接執(zhí)行其等價(jià)的 C 語言之動(dòng)作。

而比較麻煩的是等價(jià)於迴圈的部分,假設(shè)現(xiàn)在執(zhí)行的語句是第 i 個(gè),而該迴圈結(jié)束的語句是第 j 個(gè)。因?yàn)榭赡苡卸鄬拥霓捜Γ虼艘业?j 值需要類似括號(hào)匹配的演算法,例如這題。當(dāng)配對(duì)完(堆疊為空)之後的語句位置,即是 j 。

而因?yàn)槭堑葍r(jià) while(*ptr),所以我們要重複判斷 ptr 現(xiàn)在指向的陣列位置之內(nèi)容是否 = 0 。如果非 0 ,就要繼續(xù)執(zhí)行第 i + 1 ~ 第 j - 1 個(gè)語句,直到 *ptr 之值為 0 。而這部分使用遞迴是比較好處理的。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

更多創(chuàng)作