显示球拍的矢量格式

时间:2014-02-14 01:31:09

标签: vector matrix formatting racket

我使用矢量矢量制作了一个多维向量,如下所示:

#(#(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 23 1 1 1))

我想知道是否有任何可以帮助我输出的Racket函数:

(1 1  1 1 1)
(1 1  1 1 1)
(1 1  1 1 1) 
(1 1  1 1 1)
(1 23 1 1 1)

(注意:由23引起的间距变化)

我一直在阅读文档而无法找到任何内容。如果我需要为它编写我自己的函数,任何想法我将如何实现这样的东西?

2 个答案:

答案 0 :(得分:1)

在Scheme中,你可以简单地使用for循环:

(for ([i vector])
    (display (vector->list i))
       (display "\n"))

同时,如果你需要一些格式:

(displayln (string-join (for/list ([j (vector->list i)]) 
            (~a j #:width (count-digits (* n n)) #:align 'right))))

(define (count-digits a) (if (< a 10) 1 (+ 1 (count-digits (/ a 10)))))

灵活宽度逐个显示元素。

答案 1 :(得分:1)

漂亮打印二维列表的一种方法是编写一个简单的程序:

(define (print-2-dim-list lol)
  (define (transpose xss)
    (apply map list xss))
  (define t (transpose lol))
  (define list-of-max-len (map (λ (l) (foldr (λ (x v) (max (string-length (format "~a" x)) v)) 0 l)) t))
  (printf "(\n")
  (for ([row lol])
    (printf "(")
    (for ([x row]
          [max-len list-of-max-len])
      (printf "~a" x)
      (for ([n (+ 1 (- max-len (string-length (format "~a" x))))])
        (printf "~a" #\space)))
    (printf ")\n")
    )
  (printf ")\n"))


(print-2-dim-list (map vector->list (vector->list #(#(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 23 1 1 1)))))

(
(1 1  1 1 1 )
(1 1  1 1 1 )
(1 1  1 1 1 )
(1 1  1 1 1 )
(1 23 1 1 1 )
)

另一种方法是使用 Laurent Orseau 的 text-table,它现在支持自定义边框样式。

(displayln
 (table->string (map vector->list (vector->list #(#(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 1 1 1 1) #(1 23 1 1 1))))
                #:border-style
                '(#\space ("(" " " ")")
                  ("(" "" "")
                  ("" "" "")
                  (")" "" ""))
                #:framed? #t
                #:row-sep? #f
                #:align  '(left)))

(      
(1 1  1 1 1)
(1 1  1 1 1)
(1 1  1 1 1)
(1 1  1 1 1)
(1 23 1 1 1)
)