ASCII 艺术和数字

ASCII art and numbers

我正在尝试编写代码,在直角三角形中打印用户输入的数字。例如,如果输入 8,它应该如下所示:

*
**
* *
*  *
*   *
*    *
*     *
********
1
12
123
1234
12345
123456
1234567
123345678

我正在尝试让它工作:

puts " Enter a number: "
number = gets.to_i
puts "*" * number
count = 0
while count < number - 2
  print "*"
  print " " * (number - 2)
  puts "*"
  count += 1
end
puts "*" * number

结果是一个正方形。这是我得到的:

*****
*   *
*   *
*   *
*****

我哪里错了?

你意外方块的顶部来自这条线

puts " Enter a number: "
number = gets.to_i
--> puts "*" * number <--

而且你的右侧没有倾斜,因为 number 的值没有改变。您应该使用 count 而不是

下面是另一种方法,您可以将创建行的逻辑与该行中应该出现的内容分离

def run(how_many_rows, &display_block)
  how_many_rows.times do |row_index|
    to_display = display_block.call(row_index)

    puts(to_display)
  end
end

how_many_rows = gets.to_i

run(how_many_rows) do |row|
  Array.new(row + 1) do |idx|
    is_first_char = idx == 0
    is_last_char  = idx == row
    is_last_row   = (row + 1) == how_many_rows

    show_star = is_first_char || is_last_char || is_last_row

    if show_star
      '*'
    else
      ' '
    end
  end.join
end

run(how_many_rows) do |row|
  (1..(row + 1)).to_a.join
end