Flower Field 是对热门游戏 Minesweeper 的一次充满温情的重新演绎。游戏的目标是利用数字提示找出花园中所有的花,这些提示会说明有多少朵花与某个方格直接相邻(水平、垂直或对角方向)。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"
处理这一点正是这道练习的挑战之一。