【问题标题】:Vector Formatting for Display Racket显示球拍的矢量格式
【发布时间】:2021-04-24 05:59:10
【问题描述】:

我已经使用这样的向量向量制作了一个多维向量:

#(#(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引起的间距变化)

我一直在阅读文档,但找不到任何东西。如果我需要为它编写自己的函数,知道如何实现这样的东西吗?

【问题讨论】:

    标签: vector matrix formatting racket


    【解决方案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)))))
    

    灵活宽度逐一显示元素。

    【讨论】:

    • 如果我这样做了,我可以让它们一个接一个地出现,但是如何获得那个间距呢?注意第三列的间距。
    • 请查看有关获取该间距的更新答案。祝你好运。
    【解决方案2】:

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

    (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)
    )      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多