【问题标题】:Common Lisp - get length of nested vectorCommon Lisp - 获取嵌套向量的长度
【发布时间】:2015-08-08 06:58:20
【问题描述】:

我有一个数据结构:

*game-board*

#(#() #() #() #() #() #() #())
CL-USER> (test-move)
1
CL-USER> *game-board*
#(("O" "X" . #()) ("O" "X" . #()) ("X" "O" "O" "X" . #())
  ("X" "O" "X" "O" . #()) ("O" "X" . #()) ("X" . #()) ("X" "O" . #()))
CL-USER> (print-game-board)

("O" "X" . #()) 
("O" "X" . #()) 
("X" "O" "O" "X" . #()) 
("X" "O" "X" "O" . #()) 
("O" "X" . #()) 
("X" . #()) 
("X" "O" . #()) 
NIL
CL-USER> 

我的问题是如何获得内部向量的尺寸?

(array-dimension game-board 0) 为外部向量的长度返回 7。我怎么不知道如何获得内部向量的尺寸。

我的代码填充板是这样的:(每次输入运行一次)

(defun move (c)
  (let ((place (gethash c *col-lookup*)))
    (cond ((oddp *turn-count*)
           (push "X" (aref *game-board* place))
           (incf *turn-count*))
          ((push "O" (aref *game-board* place))
           (incf *turn-count*)))))

我使用向量是因为我认为我可以将移动推到棋盘上,当检查长度是否小于 4 时,然后跳过该行的水平检查。

在我找到解决方案之前,我是否正在考虑优化?这可能是不明智的,我可能应该按照建议使用二维数组来破解一些东西。

【问题讨论】:

  • 只使用二维数组。你不需要在 Common Lisp 中使用向量的向量。

标签: arrays vector common-lisp


【解决方案1】:

那是因为你没有内部向量。虽然您从一个带有 7 个向量的向量开始,但在 (test-move) 之后,您有一个包含 7 个不正确列表的向量,其最后一个元素是 #()。您能否将代码添加到 test-move,以便我们帮助您查看那里出了什么问题?

顺便说一句,我猜当您想表示网格时,您正在使用列表表示形式的列表?如果是这样,我可以建议使用多维数组或仅使用向量和一些辅助函数来从一对移动到一个索引并返回。

【讨论】:

    【解决方案2】:

    内部数组可能并非都具有相同的维度,因此这里有一个示例,可以为您提供最大维度:

    (defun inner-dimension (outer-array)
      (loop for inner-array being the elements of outer-array
            maximize (array-dimension inner-array 0)))
    

    如果您希望内部数组的大小都相同,则应使用单个多维数组而不是数组数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2021-12-25
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2012-12-11
      • 2012-01-20
      相关资源
      最近更新 更多