轨道
/
jq
jq
/
练习
/
花田
花田

花田

困难

简介

Flower Field 是对热门游戏 Minesweeper 的一次充满温情的重新演绎。游戏的目标是利用数字提示找出花园中所有的花,这些提示会说明有多少朵花与某个方格直接相邻(水平、垂直或对角方向)。Flower Field 曾随 Microsoft Windows 的地区版本在意大利、德国、韩国、日本和台湾发行。

说明

你的任务是给一块已完成的花田中的空格填上花的数量。花园本身是一块矩形棋盘,棋盘上的格子要么是空格(' '),要么是一朵花('*')。

对每个空格,数出与它相邻的花的数量(横向、纵向、斜向)。如果空格周围没有相邻的花,就保持为空。否则,用相邻花的数量替换它。

例如,你可能会拿到下面这样一块 5 x 4 的棋盘(为了在屏幕上显示,这里的空白位置用“·”表示):

·*·*·
··*··
··*··
·····

你的代码应该把它转换成这样:

1*3*1
13*31
·2*2·
·111·

额外的 jq 命令行选项

你会注意到测试中给 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"

处理这一点正是这道练习的挑战之一。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
jq Exercism

准备好开始 花田 了吗?

注册 Exercism,借助 12 个概念75 个练习 和真人导师指导,学习并掌握 jq,全部免费。

深入探索 花田!

我们探讨嵌套 for 循环、巧妙运用 min/max 简化边界检查、函数式管道以及二维矩阵的使用。