Flower Field 是熱門遊戲《踩地雷》的暖心改編版。 遊戲的目標是找出花園裡所有的花,方法是利用數字提示,這些提示會指出與某個方格直接相鄰(水平、垂直、對角)的花有幾朵。 「Flower Field」曾收錄在義大利、德國、南韓、日本與台灣的 Microsoft Windows 地區版本中。
你的任務是在一座完成的花田花園中,為空格加上花的數量。
花園本身是一塊由格子組成的長方形棋盤,每個格子不是空格(' ')就是一朵花('*')。
對每個空格,數一數與它相鄰的花有幾朵(水平、垂直、對角)。 如果這個空格沒有相鄰的花,就讓它保持空白。 否則就用相鄰花的數量取代它。
舉例來說,你可能會收到像這樣一塊 5 x 4 的棋盤(為了在畫面上顯示,這裡用 '·' 字元來代表空格):
·*·*·
··*··
··*··
·····
你的程式應該把它轉換成這樣:
1*3*1
13*31
·2*2·
·111·
你會在測試中注意到jq多了些選項。
run jq -s -R -c -f flower-field.jq << 'END_INPUT'
它們是什麼?
-s
這是「slurp」模式。 輸入不會被當成一連串的 JSON 物件來處理, 而是整份輸入都會被放進一個陣列裡。
$ seq 5 | jq -c '.'
1
2
3
4
5
$ seq 5 | jq -s -c '.'
[1,2,3,4,5]
-R
你或許已經看過-r,用來輸出「原始」字串(不含引號)。
這個選項正好相反。
輸入的每一行都會被視為一個字串。
兩個例子:
$ seq 5 | jq -R -c .
"1"
"2"
"3"
"4"
"5"
$ echo 42 | jq '. * 2' # input is a JSON number
84
$ echo 42 | jq -R '. * 2' # input is a JSON string
"4242"
把這兩個選項搭在一起時,你_不會_得到一個字串陣列, 而是會把整份輸入當成單一個字串,包括每一行結尾的換行字元。
$ seq 5 | jq -s -R -c .
"1\n2\n3\n4\n5\n"
怎麼處理這種情況,也是這道練習的挑戰之一。