gpt4 book ai didi

f# - 遍历 F# 二维数组

转载 作者:行者123 更新时间:2023-12-04 18:51:21 24 4
gpt4 key购买 nike

我正在 F# 中创建一个棋盘(类型)游戏,并且在以“功能”方式遍历数组时遇到了一些麻烦。

我有一个数组,例如,看起来像:

val myArray : int [,] = [[1; 1; 0; 0; 0]
[0; 0; 1; 0; 0]
[2; 0; 0; 0; 3]
[0; 0; 0; 0; 0]
[0; 1; 0; 0; 1]]

我想基于上述创建一个新数组,其中:
  • 如果该项目 > 0,那么在新数组中应该是数字 1
  • 如果项目 = 0,则:
  • 如果左侧或右侧或上方或下方的项目 > 1,则在新数组中该数字应为 2
  • 否则,如果右侧或上方或下方的一项 = 1,则在新数组中该数字应为 3
  • 否则,数字应为 4

  • 这应该创建一个新数组,如下所示:
    val myArray : int [,] = [[1; 1; 3; 4; 4]
    [2; 3; 1; 3; 2]
    [1; 2; 3; 2; 1]
    [2; 3; 4; 4; 2]
    [3; 1; 3; 3; 1]]

    我在 F# 中看不到任何简单的方法来实现这一点。在 C# 中,我只需创建一个 for循环来做到这一点,但我认为在 F# 中可能有一种偷偷摸摸的方法,使用诸如 map 之类的东西。功能 - mapi看起来很有希望,但它似乎只能访问正在考虑的当前部分及其索引,而不是整个数组......

    我的问题似乎是游戏规则取决于周围区域,而标准遍历方法似乎无法访问周围区域 - 实现我正在做的事情的最佳方法是什么?

    最佳答案

    我不认为我在这个解决方案中做了任何偷偷摸摸的特技。我使用 Array2D.init 来构建一个新数组。 init 所需的函数决定了每个位置的数组值。

    此外,我将收集邻居放在一个单独的功能中。在邻居函数中,我使用了列表理解并只产生有效的邻居,避免了角落和边缘的麻烦。

    这就是我想出的(警告:当二维数组为 1x1 或为空时它会失败,我将它留给读者以防止这种情况):

    let neighbors r c (A:'a[,]) =
    [if r > 0 then yield A.[r-1,c]
    if r < Array2D.length1 A - 1 then yield A.[r+1,c]
    if c > 0 then yield A.[r,c-1]
    if c < Array2D.length2 A - 1 then yield A.[r,c+1]]

    let newArray A =
    Array2D.init (Array2D.length1 A) (Array2D.length2 A)
    (fun r c ->
    if A.[r,c] > 0 then 1
    else
    match neighbors r c A |> List.max with
    | 1 -> 3
    | 0 -> 4
    | _ -> 2
    )

    在 F# 交互中测试:
    let myArray = array2D [[1; 1; 0; 0; 0]
    [0; 0; 1; 0; 0]
    [2; 0; 0; 0; 3]
    [0; 0; 0; 0; 0]
    [0; 1; 0; 0; 1]]

    let result = newArray myArray

    结果:
    val result : int [,] = [[1; 1; 3; 4; 4]
    [2; 3; 1; 3; 2]
    [1; 2; 3; 2; 1]
    [2; 3; 4; 4; 2]
    [3; 1; 3; 3; 1]]

    关于f# - 遍历 F# 二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5801260/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com