gpt4 book ai didi

layout - 在 Lisp 的列中打印嵌套列表

转载 作者:行者123 更新时间:2023-12-04 10:06:46 25 4
gpt4 key购买 nike

我对如何连续打印几个类似矩阵的嵌套列表有疑问,一行接一行,垂直对齐,以便它们出现在另一列下方的列中。

我尝试了几种方法,但都没有奏效,我使用了几种文本格式,但没有按预期输出。有什么建议?

我更新了疑问,希望现在你能理解。

(defun tabA()
'((X 0 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)))

(defun tabB()
'((0 0 0 0 X 0 0)
(0 0 0 0 0 0 0)
(0 T 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)))

(defun tabC()
'((0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)))

(defun states ()
(list (tabA) (tabB) (tabC)))

(defun test-print ()
(format T "~%--- Result ---")
(mapcar #'(lambda(x) (print-state x)) (states)))

(defun print-state (x)
(format T "~%")
(mapcar (lambda (x) (format T "~@T~@T~@T~@T~@T ~A ~%" x)) x)
(format NIL ""))

;;test print
(test-print)

您可以在 ideone.com 中测试并查看结果像这个例子
--- Result ---
(X 0 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)

(0 0 0 0 X 0 0)
(0 0 0 0 0 0 0)
(0 T 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)

(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)

我想在两列或三列中打印这些列表,就像这个例子
--- Result ---
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)

(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)

最佳答案

如果输入在示例数据中是常规的,则可以通过遍历表的行索引并遍历表本身以按顺序打印行来简单地完成此操作:

(defun print-tables (tables)
(let ((rows (length (first tables))))
(loop for n below rows do
(terpri)
(dolist (table tables)
(format t "~A " (elt table n))))))
print-tables函数将表列表作为其参数。这里假设表格都是具有规则列宽的相同形状。数量 rows为第一个表计算, loop计算从 0 开始的行索引,用 (terpri) 打印换行符在打印每个表格行序列之前。 dolist迭代 tables对于每张 table n打印第 1 行。相同的方法可用于更不规则的数据,并带有一些额外的格式化代码。

SCRATCH> (print-tables (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL

上面的代码只是在单行表格中按顺序打印表格,但对于大量表格,明智地将表格分组会更好。一个 group-tables函数可以在 print-groups 中编写和使用利用上述功能 print-tables功能。
(defun group-tables (grouping tables)
(labels ((iter (tables group)
(cond ((null tables)
(list group))
((= (length group) grouping)
(cons group
(iter tables '())))
(t
(iter (rest tables)
(append group (list (first tables))))))))
(iter tables '())))

这里 group-tables接受一个表格列表和一个整数参数,指定每个输出行所需的最大分组。本地 iter函数建立一个组列表,但随着进度的进行,每个组都在一个累加器中构建;请注意 append此处用于使表格保持与输入相同的顺序。
(defun print-groups (grouping tables)
(dolist (group (group-tables grouping tables))
(print-tables group)
(terpri)))

这里 print-groups只是使用 group-tables将表收集到组中,然后使用 dolist通过 print-tables 挑选出每个单独的组进行处理功能。

示例 REPL 交互:

SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 2 (list (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)

(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 4 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))

(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0) (X 0 0 0 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0) (0 0 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 T 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)

(0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL

关于layout - 在 Lisp 的列中打印嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61551936/

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