Javascript Mineswaper算法解

Javascript Mineswaper算法解,javascript,arrays,algorithm,ecmascript-6,minesweeper,Javascript,Arrays,Algorithm,Ecmascript 6,Minesweeper,这是一个关于codefight callenge的问题 参赛者被要求检查以2D阵列表示的扫雷场是否有效 详情: 扫雷游戏板的每个单元可以是: 矿井(显示为9) 或者一个数字,表示周围单元中的地雷数量 (当一个单元格在至少一个角上与另一个单元格相交时,该单元格被视为围绕着另一个单元格)(显示为0-8) 我的方法(有效): 循环浏览所有项目 检查邻居是否有地雷(如果有,计算地雷数量) 将发现的地雷数量与瓷砖上的数字进行比较 如果数字不相等,则返回false,否则继续 有人能给我解释一下这种方

这是一个关于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)
           )
     )
扫雷1=g=>
!g、 一些((r,i)=>
r、 一些((c,j)=>
c<9&(f=d=>d--?f(d)-(g[i+~(d/3)]| | 0[j+d%3-1]>8):c)(9)
)
)
我有多了解:

  • g是2D数组,表示字段
  • 。如果数组中的某个元素将通过测试,则某些元素将进行测试
  • r是字段中的单行
  • c是每行中的每个元素
  • 我和j是什么?柜台
  • 什么是d
  • 编写如此神秘的代码有什么好处
(如果您想知道~-(d/3),它会执行以下操作:

0-2: ~-([0,1,2]/3) = ~-0 = -(-0)-1 = -1
3-5: ~-([3,4,5]/3) = ~-1 = -(-1)-1 = 0
6-8: ~-([6,7,8]/3) = ~-2 = -(-2)-1 = 1
)

因此,函数基本上会经历这个模式(0是字段,X是当前选中的位置)

然后,如果有一个地雷(>8),它从字段中减去1(真)。因此,如果这个区域是4,周围有4个地雷,它将产生4-1-1-1-1,所以整个结果是0,这是错误的:

两个示例(字段位于中间):

因此递归函数将返回0(falsy)(4-1-1-1-1)

这将返回1(truthy)(4-1-1-1)

所以这个递归函数可以重命名为countaroundswong:

因此,如果有一个地雷,周围的计数是错误的,有一些领域发现,整个事情是真的,得到倒置,结果是假的。一种非神秘的方式:

function countaroundiswrong(mainarray,field,col,row){
 for(var x=-1;x<2;x++){
  for(var y=-1;y<2;y++){
    if(mainarray[row+x] && mainarray[row+x][col+y]){
      if(mainarray[row+x][col+y] >8){
         field--;
      }
    }
   }
  }
  return field;
}
函数countaroundiswrong(主数组、字段、列、行){

例如(var x=-1;x编写如此神秘的代码的原因可能只有两个-1:有人希望代码不太清晰,让其他人看不到,或者2:它已被缩小以节省下载大小(这对于这么少的代码来说几乎是无用的,但如果它是某个较大的代码库的一部分,则可能有意义)-@all如果你知道任何原因,请添加其他原因!@s如果你想炫耀你仍然能够理解那里写的内容;)我真的不明白为什么人们总是这么做。这可能会使代码变得非常简短,但我无法理解它。它不完全理解它,我希望我会,如果我理解了,我会给你一个正确的答案,而不是一个评论。我想我可以帮你对你的一个问题给出一个简短的答案-答案最后一点。要回答你的最后一点:谷歌代码高尔夫,你会找到喜欢这种代码的人(包括我自己),所以答案可能是:只是为了好玩:0@User12547645我很确定i和j是索引(分别是行数和列数),其中r和c是值本身。变量d在lambda(匿名函数)“f”中声明,我想这是后来使用的,并传递了值“9”。
0-2: ~-([0,1,2]/3) = ~-0 = -(-0)-1 = -1
3-5: ~-([3,4,5]/3) = ~-1 = -(-1)-1 = 0
6-8: ~-([6,7,8]/3) = ~-2 = -(-2)-1 = 1
d=0
X - -
- 0 -
- - -

d=1
- X -
- 0 -
- - -

d=2
- - X
- 0 -
- - -

d=3
- - -
X 0 -
- - -

...
9 9 9
9 4 1
1 1 0
9 9 9
2 4 1
0 0 0
!mainarray.some((row,rownumber) =>
  row.some((field,columnumber) =>
    fieldismine() && countaroundiswrong(mainarray,field,rownumber,columnumber)
  )
)
function countaroundiswrong(mainarray,field,col,row){
 for(var x=-1;x<2;x++){
  for(var y=-1;y<2;y++){
    if(mainarray[row+x] && mainarray[row+x][col+y]){
      if(mainarray[row+x][col+y] >8){
         field--;
      }
    }
   }
  }
  return field;
}