Common Lisp - 获取嵌套向量的长度

时间:2015-08-08 06:58:21

标签: arrays vector common-lisp

我有一个数据结构:

*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时,然后跳过该行的水平检查。

在我有解决方案之前,我是否考虑过优化?这可能是不明智的,我可能应该根据建议使用二维数组一起破解一些东西。

2 个答案:

答案 0 :(得分:4)

那是因为你没有内在的载体。虽然你从带有7个向量的向量开始,但是在(测试 - 移动)之后你有一个带有7个不正确列表的向量,其最后一个元素是#()。你可以将代码添加到test-move中,这样我们可以帮助你看看那里出了什么问题吗?

顺便说一下,当你想要代表一个网格时,我猜你正在使用一个列表表示?如果是这样,我建议使用多维数组或仅使用向量和一些辅助函数从一对转移到索引并返回。

答案 1 :(得分:0)

内部数组可能并非都具有相同的维度,因此这里是一个给出最大维度的示例:

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

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