Как выровнять таблицу умножения? - PullRequest
0 голосов
/ 15 мая 2019

Я создаю программу, в которой вы даете 2 входа, количество столбцов и количество строк для системы мультипликации. Но при наличии больших чисел (двухзначных чисел) система не выравнивается.

Нет ничего плохого в коде. Все, что я хочу, это то, что делает "|" выровнено по вертикали.

Я хочу, чтобы вывод был;

| 3 | 6  | 9  |
| 4 | 8  | 12 |
| 6 | 12 | 18 |

Но я получаю вывод;

| 3 | 6 | 9 |
| 4 | 8 | 12 |
| 6 | 12 | 18 |

1 Ответ

1 голос
/ 15 мая 2019
arr = [3, 6, 9, 4, 8, 12, 6, 12, 18]
nrows = 3

width = arr.minmax.map { |n| n.to_s.size }.max
  #=> 2

puts arr.each_slice(nrows).map { |row| '| ' +
  row.map { |n| "%-#{width}d" % n }.join(' | ') + ' |' }
| 3  | 6  | 9  |
| 4  | 8  | 12 |
| 6  | 12 | 18 |

Возможно, вы предпочитаете отрегулировать вправо:

puts arr.each_slice(nrows).map { |row| '| ' +
  row.map { |n| "%#{width}d" % n }.join(' | ') + ' |' }
|  3 |  6 |  9 |
|  4 |  8 | 12 |
|  6 | 12 | 18 |

См. Kernel # sprintf для директив форматирования. Если известно, что все элементы arr неотрицательны, мы могли бы написать:

width = arr.max.to_s.size
  #=> 2

Если вы хотите сделать каждый столбец как можно более узким, корректируя его, вы можете сделать следующее.

arr = [3, 6, 9, 4, -81, 12, 6, 12, 1800]
nrows = 3

col_widths = nrows.times.map { |i|
  (i..nrows*nrows-1).step(3).map { |j| arr[j].to_s.size }.max }
  #=> [1, 3, 4]

puts arr.each_slice(nrows).map { |row| '| ' +
  row.map.with_index { |n,i| "%#{col_widths[i]}d" % n }.join(' | ') + ' |' }
| 3 |   6 |    9 |
| 4 | -81 |   12 |
| 6 |  12 | 1800 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...