如何制作一个 Ruby 方法来制作宽度为 'n' 的星号菱形?
How do I make a Ruby method that makes a diamond of asterisks with 'n' width?
我正在尝试创建一种方法,使用星号 (*) 字符,returns 字符串在屏幕上打印时看起来像菱形。我想删除任何尾随字符和每一行 终止 与 (\n)。如果输入是偶数或负数,我也希望它 return nil ,因为不可能打印偶数或负尺寸的钻石。例如
*
n=3 ***
*
*
***
n=5 *****
***
*
或者换句话说
" *\n ***\n*****\n ***\n *\n"
方法看起来像这样:
def diamond(n)
end
有人可以帮忙吗?谢谢!
你可以试试这个:
def diamond(n)
return nil if n < 1 || n.even?
odds = (1..n).select(&:odd?)
(odds + odds[0..-2].reverse).map { |i| ('*' * i).center(n).chomp << "\n" }.join
end
另一个解决方案:
def diamond(n)
return nil if n.even? || n.negative?
diamond_string = ""
n.times do |i|
space_count = (i - n / 2).abs
asterisk_count = n - space_count * 2
diamond_string << [' ' * space_count, '*' * asterisk_count].join + "\n"
end
return diamond_string
end
我正在尝试创建一种方法,使用星号 (*) 字符,returns 字符串在屏幕上打印时看起来像菱形。我想删除任何尾随字符和每一行 终止 与 (\n)。如果输入是偶数或负数,我也希望它 return nil ,因为不可能打印偶数或负尺寸的钻石。例如
*
n=3 ***
*
*
***
n=5 *****
***
*
或者换句话说
" *\n ***\n*****\n ***\n *\n"
方法看起来像这样:
def diamond(n)
end
有人可以帮忙吗?谢谢!
你可以试试这个:
def diamond(n)
return nil if n < 1 || n.even?
odds = (1..n).select(&:odd?)
(odds + odds[0..-2].reverse).map { |i| ('*' * i).center(n).chomp << "\n" }.join
end
另一个解决方案:
def diamond(n)
return nil if n.even? || n.negative?
diamond_string = ""
n.times do |i|
space_count = (i - n / 2).abs
asterisk_count = n - space_count * 2
diamond_string << [' ' * space_count, '*' * asterisk_count].join + "\n"
end
return diamond_string
end