Как напечатать элементы в векторе векторов - PullRequest
0 голосов
/ 30 мая 2019

У меня есть вектор векторов, и я хочу напечатать элементы в каждом векторе

Я попробовал pprint, но не сработал так, как хотел

Это вектор векторов, которые я хочу напечатать:

[["+" "+" "+" "#" "!" "-" "#" "#" "#" "-" "-" "-" "-"]
 ["!" "#" "+" "+" "+" "#" "+" "+" "+" "-" "#" "#" "-"]
 ["#" "#" "#" "#" "+" "#" "+" "#" "+" "#" "-" "#" "#"]
 ["+" "+" "+" "#" "+" "+" "+" "#" "+" "#" "-" "-" "-"]
 ["+" "#" "+" "#" "#" "#" "#" "+" "+" "-" "#" "#" "-"]
 ["+" "#" "+" "+" "+" "+" "+" "+" "#" "-" "-" "-" "-"]
 ["+" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"]
 ["+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "@"]]

Это вывод, который я хочу:

+++#--###--#-
!#+++#+++-##-
####+#+#+#!##
+++#+++#+#!!!
+#+####++!##!
+#++++++#!!!!
+############
++++++++++++@

Ответы [ 3 ]

4 голосов
/ 30 мая 2019

Вы можете использовать cl-format для обработки списка (и списка списка в данном случае) со строкой управления:

(def input
  [["+" "+" "+" "#" "!" "-" "#" "#" "#" "-" "-" "-" "-"]
   ["!" "#" "+" "+" "+" "#" "+" "+" "+" "-" "#" "#" "-"]
   ["#" "#" "#" "#" "+" "#" "+" "#" "+" "#" "-" "#" "#"]
   ["+" "+" "+" "#" "+" "+" "+" "#" "+" "#" "-" "-" "-"]
   ["+" "#" "+" "#" "#" "#" "#" "+" "+" "-" "#" "#" "-"]
   ["+" "#" "+" "+" "+" "+" "+" "+" "#" "-" "-" "-" "-"]
   ["+" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"]
   ["+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "@"]])

(use 'clojure.pprint)

(cl-format *out* "~{~{~a~}~%~}" input)

Выход:

+++#!-###----
!#+++#+++-##-
####+#+#+#-##
+++#+++#+#---
+#+####++-##-
+#++++++#----
+############
++++++++++++@

Пояснение: ~a - аргумент формата любого типа. Если заключено в ~{ и ~}, аргумент формата будет повторяться в списке. Поэтому, когда они заключены в два раза с ~{ и ~}, ~a будет применен к каждому элементу (символу) во вложенном списке. ~% перед последним ~} - вывод новой строки. При этом вы можете легко изменить вывод с помощью управляющей строки. Например:

(cl-format *out* "~{~{(~a)~^ ~}~^~%~%~}" input)

(+) (+) (+) (#) (!) (-) (#) (#) (#) (-) (-) (-) (-)

(!) (#) (+) (+) (+) (#) (+) (+) (+) (-) (#) (#) (-)

(#) (#) (#) (#) (+) (#) (+) (#) (+) (#) (-) (#) (#)

(+) (+) (+) (#) (+) (+) (+) (#) (+) (#) (-) (-) (-)

(+) (#) (+) (#) (#) (#) (#) (+) (+) (-) (#) (#) (-)

(+) (#) (+) (+) (+) (+) (+) (+) (#) (-) (-) (-) (-)

(+) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#)

(+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (@)

Обратите внимание, что "~^" - это директива, чтобы остановить итерацию, когда список заканчивается. Поэтому «~^<space>» будет подавлять пробел после последнего элемента в каждой строке. И "~^~%~%" будет подавлять двойной перевод строки после последней строки.

3 голосов
/ 30 мая 2019

Вам не нужно какое-либо необычное форматирование или побочные эффекты (хотя я ценю информацию в этих ответах). Просто используйте clojure.string/join, чтобы создать желаемую строку, и распечатайте ее любым старым способом.

> (join "\n" (map join input))
+++#!-###----
!#+++#+++-##-
####+#+#+#-##
+++#+++#+#---
+#+####++-##-
+#++++++#----
+############
++++++++++++@

, например

> (let [s (join "\n" (map join input))] (println s))
+++#!-###----
!#+++#+++-##-
####+#+#+#-##
+++#+++#+#---
+#+####++-##-
+#++++++#----
+############
++++++++++++@
nil
1 голос
/ 30 мая 2019

Мы можем использовать run! для обхода внешнего вектора и clojure.string / join для превращения каждого внутреннего вектора в печатаемую строку.

Предполагая, что ваш вектор определен как input:

(require '[clojure.string :as str])
(run! (comp println str/join) input)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...