ASCII艺术和数字

时间:2018-01-31 19:27:54

标签: ruby ascii-art

我试图编写用户在直角三角形中打印输入数字的代码。例如,如果输入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

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

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

我哪里错了?

2 个答案:

答案 0 :(得分:2)

意外广场的顶部来自这条线

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

你的右边并不倾斜,因为number的价值没有改变。您应该使用count代替

答案 1 :(得分:1)

下面是一种替代方法,在这种方法中,您可以解耦创建行的逻辑以及行中应该存在的内容

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