Как вывести сетку символов из списка символов? - PullRequest
3 голосов
/ 06 июня 2019

У меня есть список символов, которые я хочу распечатать в виде сетки с фиксированным столбцом. Для каждого 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 ]

2 голосов
/ 07 июня 2019

Другие уже дали хорошие ответы.Я просто хочу указать in-slice, что может быть полезно в подобных случаях.

(define (char-display char-list line-width)
  (for ([chars (in-slice line-width char-list)])
    (map display chars)
    (newline)))
1 голос
/ 06 июня 2019

Это работает:

(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 были в неправильном порядке.
  • Вы должны отображать символы в всех итераций, вы пропускали несколько, когда по модулю было ноль.
1 голос
/ 06 июня 2019

In

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

char и i проходят через char-list и цифры 0, 1, ..., linewidth-1 соответственно.Они делают это параллельно.Когда одна последовательность исчерпана, цикл останавливается.Здесь числовая последовательность самая короткая, и вы видите только одну строку.

Первое изменение заключается в том, чтобы изменить второе предложение for на

[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)))
...