您當前的位置:首頁 > 舞蹈

A=B 遊戲攻略正確程式碼參考(全挑戰,已更新至第三章)

作者:由 萌馬 發表于 舞蹈時間:2022-08-12

2022年8月12日第二次大更新:

更新第三章解法(全挑戰)。

其實第三章關卡早已完成。為什麼拖了這麼久更新,是因為始終沒有想清楚3-6的解法,只能暴力破解24行解決,覺得十分不完美,卻根本不想去看攻略,因此沒有把第三章的解法更新到這篇文件中(本人有點完美強迫症);然後這段期間一直沒有繼續玩《A=B》。今天偶然重拾這個硬核遊戲並重新點開3-6,誰知道居然靈機一動想出瞭解法,只能說是頭腦隨著時間在不斷進步hh。為了不使本攻略過長,正文不會給出非常詳細的說明,望諒解,如有需要可以在評論區詢問,不過不一定會很快回復hh。

部分關卡更詳細的說明可以看評論區,或者參考其他聰明的大佬給出的解答。

本文涉及

嚴重劇透

,請謹慎觀看;

本文目前還在更新當中,已通關第三章的全部挑戰。

本文是一款硬核程式設計遊戲《A=B》的正確程式碼參考。所有的程式碼可以成功通關,且在挑戰的行數範圍內。

偶然發現Understand作者出了新作,而且明顯致敬了Z社的遊戲,甚至小遊戲都還原的如此有趣。從“關於本遊戲”部分推測,作者疑似是一個(或一群)不愛做美工的清華計算機系(也有可能是別的工科院系)的學生,這次把編譯原理融會貫通融入了這個遊戲中來虐待我們這些玩家哈哈哈~

簡單介紹一下Zachtronics也就是粉絲口中的Z社,他們做的遊戲的特點和《A=B》十分相似:美工復古,遊戲一般基於一門自創的程式語言,有時候甚至還原了很多已存在的底層語言(如《Shenzhen I/O》的微控制器);遊戲邏輯和學習一門真正的程式語言時需要經歷的思考大同小異;遊戲一般要透過簡單的手冊學習才能夠進行;遊戲通常有一個配套的紙牌或卡牌小遊戲,美其名曰緩解壓力,實則再一次透過簡單邏輯+困難目標來虐待玩家。

本遊戲購買於2022年1月8日。《A=B》和別的程式設計遊戲不一樣的地方在於:

專注字串的

替換

處理;每一章會更新遊戲手冊以完善這個自創的程式語言。

程式如果遇到可能的執行語句,執行完畢後會

返回至最頂端重新匹配

而不是順序執行(我把此稱為

回盤

)。

排序

變得十分容易(用三個語句寫出氣泡排序),因此很多關卡首要步驟便是排序。

然而,

控制結構(主要是判斷和迴圈)變得十分繁瑣

;因為隨時可能回盤,所以前述語句對後述語句會產生非常深刻的影響。

在遊戲手冊之外要補充的是:

遊戲左上側說明欄有“限制條件”(通常為1<=輸入長度<=7),意為作者給出的所有測試輸入滿足這個限制條件;但並不意味著生成的中間字串需要滿足這個限制條件。

遊戲預設允許空字串放置於等號右側(放在左側會造成死迴圈而無意義),此時作用從字串替換變為字串刪除。

字串最大長度為255。

廢話不多說,直接開始程式碼部分;以下所有的程式碼

均由本人所寫,沒有參考任何其他攻略和解答

括號內表示(最佳程式碼行數/挑戰程式碼行數)。

第一章 A=B

1-1 A到B(1/1)

a=b

1-2 大寫(3/3)

a=A

b=B

c=C

1-3 去重(3/3)

aa=a

bb=b

cc=c

1-4 去重2(2/2)

aaa=aa

# 這裡存在空字串的定義

aa=

1-5 排序(3/3)

注意,這是很多後續關卡的基礎步驟。

ba=ab

ca=ac

cb=bc

1-6 比較(4/4)

ab=

ba=

aa=a

bb=b

第二章 關鍵字

這一章有很多似乎像寫判斷結構if的謎題(給出true/false),但是要利用這個語言會“回盤”的特性處理問題。

2-1 你好,世界(1/1)

=(return)helloworld

2-2 AAA(4/4)

本關有點難(因為a可以隔開),要反向思考,即把b、c都給去掉。

b=

c=

aaa=(return)true

=(return)false

2-3 恰好三個(5/5)

這裡的啟發:既然只關注數量,那麼把所有字母同化會很好處理。

b=a

c=a

aaaa=(return)false

aaa=(return)true

=(return)false

2-4 餘數(6/6)

同上。

b=a

c=a

aaa=

aa=(return)2

a=(return)1

=(return)0

2-5 奇數(10/10)

這裡需要用到排序的思路,然後再分別對a、b、c進行檢查;注意有可能有某個字母不出現的情況,所以處理起來要多加考慮。

ba=ab

ca=ac

cb=bc

aaa=a

bbb=b

ccc=c

aa=(return)false

bb=(return)false

cc=(return)false

=(return)true

2-6 獨一無二(13/13)

思路:所有連在一片的相同字母,只有最左和最右側的字母有效;

aaa=aa

bbb=bb

ccc=cc

aa=d

bb=d

cc=d

a=r

b=r

c=r

# only this time d can be deleted

d=

rr=(return)false

r=(return)true

=(return)false

2-7 上升(8/8)

有非常多的麻煩的地方;比如,沒有b怎麼辦?全是c怎麼辦?

這關太難了。。。排序後,把所有允許的情況都給列了出來;特別注意aabbccc這種情況,很難排除在外。

允許的a、b、c:

a

b

c

0

1

2

0

1

3

0

1

4

0

1

5

0

1

6

0

2

3

0

2

4

0

2

5

0

3

4

1

2

3

1

2

4

ba=ab

ca=ac

cb=bc

# 這一步是關鍵,它和下一步結合排除aabbccc的同時允許abbccc(c)的存在

abbccc=bcc

a=(return)false

bbcc=bc

bcc=(return)true

=(return)false

2-8 最多(11/11)

突如其來想出來的答案:如果安排順序得當(用迴圈交替的方式)可以省掉一些步驟。

ba=ab

ca=ac

cb=bc

bbbb=(return)b

aaaa=(return)a

# 本來有一個cccc=(return)c,被下面一行的功能替代了

ccc=(return)c

aaa=(return)a

bb=(return)b

aa=(return)a

c=(return)c

a=(return)a

# 最後如果還有字母剩下,一定是一個單個的b

2-9 最少(9/9)

根據分析,限制條件不會允許2-2-3這樣的字串;因此,最少的字母一定只包含0或1個數量。因此可以將中間的b的數量減少以減少判斷條件。

ba=ab

ca=ac

cb=bc

# 這裡就是上面解釋的為什麼可以減少b的數量的位置。

bbb=bb

abbc=b

abc=

bc=(return)a

ab=(return)c

ac=(return)b

第三章 首尾

這一章讓我想起了正則匹配;它的難點在於每次成功尋找到的帶有本章特色的首尾

替換

會改變首尾性質增加難度,亦可以使用這個特性配合回盤來巧妙解答。

3-1 去除(2/2)

(start)a=

(end)a=

3-2 旋轉(2/2)

(start)b=(end)b

(start)c=(end)c

3-3 A到B 2(4/4)

所有人在嘗試這關的時候應該都會悟出我在章節導語中說的“改變首尾性質增加難度”的意思;那麼我們不妨在匹配的同時改變字母位置使得

首尾性質不要被改變

(end)a=(start)A

(start)A=(end)b

(start)a=(end)A

(end)A=(start)b

3-4 交換(4/4)

難點:找到首部所有連續的a;因此要把首部匹配的a沉下。

(start)a=A

Aa=aA

(end)b=(start)b

A=(end)a

3-5 首尾 (7/7)

這一關不難;但是對於那些Output為false的字串,很容易做出很多多餘操作使得程式執行變得漫長(儘管完全不影響通關或挑戰);以下解法能儘量減少多餘操作來判斷出結果。

(end)aaT=(return)true

(end)bbT=(return)true

(end)ccT=(return)true

# 只進行一次首部匹配的標誌

(end)T=(return)false

(start)a=(end)aT

(start)b=(end)bT

(start)c=(end)cT

3-6 最多 2(11/11)

我認為這關非常難;一開始糾結於將所有的abc消完後依然得不到結果的困境,後來透過分類討論理清了思路。

ba=ab

ca=ac

cb=bc

# 以下兩步將abc替換成T,將ab替換成t,無論是否相鄰

ab=(end)t

ct=(end)T

以下兩步是互斥的,將序列轉化成“最多字母。。。t。。。T。。。”的序列

ac=(end)T

bc=(end)T

t=T

aT=aa

bT=bb

cT=cc

3-7 迴文串(8/8)

這關主要難在完成挑戰;怎麼樣快速判斷迴文串不成立。這裡不多說明因為我認為解法巧妙且很好理解,可以形象地理解為將首部匹配並移去末尾的字母加了一個“框”;一旦有相鄰的“框”出現則表示不是迴文串。

a1a1=

b1b1=

c1c1=

(start)a=(end)1a1

(start)b=(end)1b1

(start)c=(end)1c1

11=(return)false

=(return)true

未完待續~

標簽: return  end  start  遊戲  true