【发布时间】:2018-01-02 19:55:39
【问题描述】:
这是一个关于this codefight callenge 的问题。
要求参赛者检查扫雷场(表示为 2D 阵列)是否有效。
详情: 扫雷游戏板的每个单元格可以是:
- 地雷(显示为 9)
- 或表示其周围单元格中地雷数量的数字 (当该单元格在至少一个角上与该单元格相交时,该单元格被视为围绕另一个单元格)(显示为 0 - 8)
我的方法(有效):
- 循环遍历所有项目
- 检查邻居是否有地雷(并计算地雷的数量,如果有的话)
- 将发现的地雷数量与图块上的数量进行比较
- 返回false,如果数字不相等,否则继续
有人可以向我解释一下这种方法是如何工作的吗?
minesweeper1 = g =>
!g.some((r,i) =>
r.some((c,j) =>
c < 9 && (f = d => d-- ? f(d) - ((g[i + ~-(d/3)] || 0)[j + d%3 - 1] > 8) : c)(9)
)
)
我了解多少:
- g是二维数组,代表字段
- .some 将测试,如果数组中的元素将通过测试
- r 是字段中的单个单行
- c 是每一行中的每一个元素
- 什么是 i 和 j?计数器?
- 什么是d?
- 写这么神秘的代码有什么好处?
【问题讨论】:
-
代码写得这么晦涩的原因可能只有两个——1:有人想让代码不要太清晰,别人看不到,或者2:为了节省下载大小(对于这么少的代码来说几乎没用,但如果它是一些更大的代码库的一部分可能会有意义)-@all 如果您知道任何原因,请添加其他原因!
-
@Sventies 你想炫耀你仍然能够理解那里写的内容;)我真的不明白为什么人们总是这样做。这可能会使代码超短,但我无法理解它了
-
一点也不。它不完全理解它,我希望我会,如果我这样做了,我会给你一个正确的答案而不是评论。只是想我可能会帮助您简短回答您的一个问题 - 最后一个问题。
-
回答你的最后一点:google code golf 你会找到喜欢这种代码的人(包括我自己;)),所以答案可能是:只是为了好玩:0
-
@User12547645 我很确定 i 和 j 是索引(分别是行号和列号),其中 r 和 c 是值本身。变量 d 在 lambda(匿名函数)“f”中声明,我认为它后来被使用并传递了值“9”。
标签: javascript arrays algorithm ecmascript-6 minesweeper