如何从字符列表中输出字符网格?

时间:2019-06-06 07:19:31

标签: scheme racket

我有一个要打印为固定列网格的字符列表。我想为每个line-width打印到换行符。

例如,我想要

(#\Y #\q #\J #\u #\( #\t #\n #\m #\@ #\& #\c #\z #\x #\? #\} #\_ #\0 #\@ #\q #\r #\f #\/ #\I #\1 #\; #\B #\& #\O #\O #\O #\Y #\( #\n #\i #\0 #\B #\L #\h #\* #\# #\1 #\r #\? #\k #\& #\J #\J #\x #\# #\x #\i #\d #\Q #\o #\J #\J #\O #\o #\n #\_ #\v #\t #\r #\X #\c #\J #\X #\t #\z #\( #\) #\b #\C #\f #\x #\z #\d #\f #\Q #\t #\w)

显示为:

YqJu(tnm@
&czx?}_0@
qrf/I1;B&
OOOY(ni0B
Lh*#1r?k&
JJx#xidQo
JJOon_vtr
XcJXtz()b
CfxzdfQtw

这是我尝试过的:

(define (char-display char-list line-width)
  (for ([char (in-list char-list)]
        [i (in-range line-width)])
    (cond
      [(zero? i) (void)] ; to make sure modulo does not operate on zero
      [(zero? (modulo line-width i)) (display #\newline)]
      [else (display char)])))

调用上面的列表并且线宽为9的函数时,我得到:


J
(tnm@[

我在做什么错? 有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

其他人已经提供了很好的答案。我只想指出in-slice,在这种情况下可能会有帮助。

(define (char-display char-list line-width)
  (for ([chars (in-slice line-width char-list)])
    (map display chars)
    (newline)))

答案 1 :(得分:1)

(define (char-display char-list line-width)
  (for ([char (in-list char-list)]
        [i (in-range line-width)])
    ...))

chari分别贯穿char-list和数字0, 1, ..., linewidth-1。他们并行进行。当一个序列用完时,循环停止。 这里的数字序列最短,您只能看到一行。

因此,第一个更改是将第二个条款更改为

[i (in-naturals)]

第二个更改是模数的参数顺序(它们需要交换):

(modulo i line-width)

第三个更改是始终显示一个字符。可能只显示换行符。

(define (char-display char-list line-width)
  (for ([char (in-list char-list)]
        [i    (in-naturals)])
    (when (zero? (modulo i line-width))
      (unless (zero? i)
        (newline)))
    (display char)))

答案 2 :(得分:1)

这有效:

(define (char-display char-list line-width)
  (for ([char (in-list char-list)]
        [i    (in-naturals 1)])
    (display char)
    (when (zero? (modulo i line-width))
      (newline))))

您的代码有几个问题:

  • 执行(in-range line-width)只会产生不超过line-width的整数,您需要产生与列表中字符一样多的整数。
  • 我们可以在1处开始整数序列,以避免必须在零时开始处理边缘情况。
  • modulo的参数顺序错误。
  • 您必须在所有全部中显示字符,当模数为零时,您跳过了一些字符。