Level 1: Robotoast! ACCEPT: Move robots from the entrance (top) to the exit (bottom)!
沒有任何懸念,用3個元件,耗時32764(注意這是v1.30里的計時單位,在老版本中大概是0:02)。
Level 2: Robocoffee! If a robot's string starts with blue, accept. Otherwise, reject!要求接受以藍色開頭的機器人。也沒有任何可以商量的,3個元件,耗時24572。
Level 3: Robolamp! ACCEPT: if there are three or more blues!
要求接受紙帶中有至少3個藍點的機器人。8個元件,112570時間。
Level 4: Robofish! ACCEPT: if a robot contains NO red!
要求接受沒有紅點的機器人。4個元件,32764時間。
Level 5: Robobugs! ACCEPT: if the tape has only alternating colors!
如果紙帶上的顏色是交替出現的(沒有連續的紅色或藍色)就接受。6個元件,32900時間。
Level 6: Robocats! ACCEPT: if the tape ends with two blues!
如果最后兩個顏色是藍色則接受。11個元件,182272時間。
Level 7: Robobears! ACCEPT: Strings that begin and end with the same color!
如果第一個和最后一個色點顏色相同則接受。注意沒有色點和只有一個色點這兩種特殊情況。15個元件,176136時間。
Level 8: RC Cars! OUTPUT: The input, but with the first symbol at the end!
把第一個色點放到最后去。7個元件,49144時間。
Leve 9: Robocars! OUTPUT: Replace blue with green, and red with yellow!
把藍色和紅色分別換成了綠色和黃色。7個元件,229374時間。
Level 10: Robostilts! OUTPUT: Put a green at the beginning and a yellow at the end!
在色帶的最前端放一個綠色,末尾處放一個黃色。毫無懸念,9個元件,53244時間。
Level 11: ACCEPT: With blue as1 and red as0, accept odd binary strings!
只接受奇數數字,也就是最后一位是藍色的。至于空色帶就無所謂了,嚴格來講應該是不接受,但至少這個版本里沒有這樣的測試數據。8個元件,167931時間。
Level 12: Soldiers! OUTPUT: With blue as1 and red as0, multiply by 8!
要把輸入的數字乘以8,程序員對這個應該是得心應手了,再末尾添加三個0(紅色)即可。7個元件,65520時間。
Level 13: Officers! OUTPUT: With blue as1 and red as0, add 1 to the binary string!
給輸入的數字做加1操作。開始的時候感覺是無法完成的,但仔細想想就很簡單。加1操作,從二進制的角度來看,就是把末尾的1都變成0,最后一個0變成1。主要的難點是要從最后一位往前加,所以要不端地循環,每次都處理最后一個沒有處理過的色點。另外在優化的時候發現,可以先把末尾的1變成黃色,這樣就不需要再另外使用分隔符號了。分隔符用來標記字串的中止以及當前處理到的位置。19個元件,81580時間。Level 14: Generals! OUTPUT: Substract 1from the binary string! (Input >= 1)
減1操作,跟第13關其實是一樣的,紅色和藍色互換就好了。19個元件,79750時間。但這一關還可以再稍微調整一下布局,變成18個元件,81686時間。Level 15: Robotanks! ACCEPT: With blue as1 and red as0, accept binary strings > 15!
要求接受大于15的數字。也就是要求大于或等于16,即1后面至少有四個二進制位。于是就是要判斷第一個藍色后面是否至少有四個色點,不論顏色。25個元件,19958時間。
Level 16: Robospies! ACCEPT: With blue as1 and red as0, accept natural powers of four!
要求接受4的冪,也就是第一個藍色后面必須恰好有偶數(包括0)個紅色色點。注意要忽略掉開頭的紅色。8個元件,57372時間。
Level 17: Androids! ACCEPT: Some number of blue, then the same number of red!
要求紙帶上的色點必須是若干個藍色后面跟著同樣數量的紅色。開始也是覺得很難,主要是沒有辦法計數。當然解決辦法就是一次一次循環,每次循環中判斷一對紅藍色點。對于這種需要循環處理的問題,我一般都用一個黃色作為分隔符作為字符串的終結標記。12個元件,63041時間。
Level 18: Robo-children! ACCEPT: An equal number of blue and red, in any order!
判斷色帶上藍色和紅色的數量是否恰好相等。依舊是每次循環檢查一對。23個元件,266582時間。
Level 19: Police! OUTPUT: Put a yellow in the middle of the (even-length) string!
輸入的色帶上有偶數個色點(不用判斷是否滿足),要求在中間位置插入一個黃色。這一關開始想了好久,排滿了整個棋盤才搞定,后來一直優化到40個元件。想到了兩種方案,一種是在顏色串的首尾各放一個色點,每次循環的時候讓兩個色點分別向中間移動一格,直到二者相遇。另一種是用起始位置放兩個色點,每次循環的時候一個色點往后移動一格,另一個色點往后移動兩個。我最后的優化版是采用第二種方法的。40個元件,291584時間。如果輸入的色帶上有奇數個色點,那我的算法會在中間色點的后方插入黃色。Level 20: Judiciary! ACCEPT: (Even-length) strings that repeat midway through!
判斷色帶上的色點(偶數個)是否恰好前半部分與后半部分的排列完全一樣。比如如果前半部分是紅藍紅紅藍,后半部分也必須是紅藍紅紅藍。這一關我是直接利用了第19關和第29關(恰好我是先完成了第29關才回過頭玩的這關),即先給這個顏色串的中間位置添加一個黃色(直接照搬第19關的布局),然后利用第29關的布局判斷黃色分割的兩個子串是否完全一致。52個元件,319428時間。Level 21: Teachers! ACCEPT: X blue, then X red, then X more blue, for any X!
要求色帶上恰好是有若干個藍色,跟著同樣數目的紅色和另外同樣數目個藍色。也可以是一個色點都沒有。跟第17關的算法完全一樣,只要再考慮考慮布局即可。20個元件,76590時間。Level 22: Politicians! ACCEPT: If there are exactly twice as many blues as red!
判斷色帶上藍色是否恰好是紅色的兩倍。這一關其實跟第18關沒有太大區別,一個簡單高效的解決辦法就是先把藍色減半,然套用第18關的布局來檢測減半后的藍色是否與紅色數目相等。給藍色減半的時候,比較傳統的辦法是用一個黃色作為色串終止符,從頭開始,每讀到一個紅色就寫一個紅色,讀到兩個藍色之后寫一個藍色。或著稍微變化一下,不用額外的黃色作終止符,而是在遍歷的時候直接用黃色替換紅色,用一個綠色替換兩個藍色。用29個元件,296870時間。Level 23: Academics! OUTPUT: Reverse the input string!
把輸入的顏色串反轉。基本的方法就是把第一個色點放到色串的最后,再把第二個色點放到倒數第二位。除了用一個黃色標記色串的終止外,在用一個綠色分割尚未處理的色串和部分反轉了的色串。用25個元素,227328時間。Level 24: Engineers! ACCEPT: Perfectly symmetrical strings!
判斷顏色串是否是對稱的。也比較簡單啦,每次用第一個色點做分支,在每個分支里判斷最后一個色點,如果跟第一個一樣則繼續,否則丟棄。用25個元件,47696時間。
Level 25: Roborockets! OUTPUT: Swap blue for red, and red for blue!
把紅藍顏色互換。毫無懸念,7個元件,229374時間。
Level 26: Roboplanes! OUTPUT: All of the blue, but none of the red!
保留輸入中的所有藍色,丟掉紅色。跟第25關唯一的區別就是遇到紅色后不再寫回到色帶上。7個元件,22526時間。
Level 27: Rocket Planes! OUTPUT: The input, but with all blues moved to the front!
把輸入中的藍色都移動到紅色的前面。這一關有點兒意思,我最后設計的方法是直接利用第23關反轉輸入的方法。在第23關的布局中,中軸線左邊是針對第一個是藍色的處理,右邊是針對第一個是紅色的處理。在這一關里依舊保留右半邊,但把左半邊改成遇到藍色就直接寫一個藍色回去。最后的效果就是不斷地把紅色往最后寫,直到紅色全都聚集到后半部分。用16個元件,12390時間。Level 28: Robomecha! OUTPUT: The input, but with the last symbol moved to the front!
把最后一個色點放到最前面。很簡單,19個元件,606214時間。
Level 29: Seraphim! ACCEPT: Two identical strings, separated by a green!
判斷由綠色點分開的兩個色串是否完全相等。也挺簡單的,補一個綠色作為終止符,取出色串一的第一個顏色,把其他的寫回紙帶,判斷色串二的第一個顏色跟它是否一樣;這時候兩個色串都去掉了第一個顏色,而且剛好色串二跟色串一交換了順序,再重復用同樣的方法判斷下去即可。21個元件,166182時間。
Level 30: Ophanim! ACCEPT: Read the tape as two numbers, A and B, split by a green: accept if A > B!
由綠色點分開的兩個色串,從二進制數字的角度判斷是否前一個數大于后一個數。我用的方法是求B - A,當然不用記錄完整的結果,只要記錄借位狀態即可。不過我沒有再進行優化,現在用了88個元件,60617時間。估計能優化掉一小半的元件。Level 31: Metatron! OUTPUT: Read the tape as two numbers, A and B, split by a green: output A + B!
計算被綠色分開的兩個數字之和。基本上就是從最低位逐位加上去。同樣是還沒有優化,應該能減少一半以上的元件。現在用120個元件,108630時間。來自網絡的題解與優化