如何在Ruby中一行代码中计数从1到9。
如何在Ruby中一行代码中计数从1到9。
我正在努力想出如何在Ruby中在一行内循环数字。
x = 0 while x <= 9 puts x x += 1 end
这将给出:
0 1 2 3 4 5 6 7 8 9
每个数字都在不同的行上。
但是我想要的是在一行上获得这些数字,就像:
01234567891011121314151617181920
也不仅限于0到9,更像是从0到无穷大在一行上。
目的是创建一个遵循这个模式的任意大小的三角形:
1 12 123 1234 12345 123456
每个数字都在不同的行上。这里的格式不允许我在不同的行上放置它们。
真的很想解决这个问题。它让我头疼。
问题出现的原因是需要在Ruby中以单行的方式计数1到9,即每行输出一个数字。
解决方法是通过将数字1到9转换为字符串并连接起来,然后使用循环逐行打印字符串的子串。
以下是解决方法的代码:
last_num = 9 str = (1..last_num).to_a.join # 创建字符串123456789 0.upto(last_num-1){ |i| puts str[0..i] } # 逐行打印
该代码首先将数字1到9转换为数组,然后使用`join`方法将数组元素连接成字符串。接下来,使用循环从0到8的索引值,通过`puts`方法打印字符串的子串,即从第一个字符到当前索引值的字符。这样就实现了在单行中逐个打印数字1到9的效果。
问题的出现原因是用户想要创建一个遵循特定模式的任意大小的三角形,但是用户对如何实现这一目标没有明确要求。以下是两种实现方法。
#1
def print_triangle(n) (1..n).each.with_object('') { |i,s| puts s << i.to_s } end print_triangle(9) 1 12 123 1234 12345 123456 1234567 12345678 123456789
#2
def print_triangle(n) s = (1..n).to_a.join (1..n).each { |i| puts s[0,i] } end print_triangle(9) 1 12 123 1234 12345 123456 1234567 12345678 123456789
这里的临时字符串是用来做什么的?:)
我打印了s
的第一个字符,然后是s
的前两个字符,以此类推,而不是为每行创建一个字符串(通过创建一个数组然后连接)。这样回答了你的问题吗?请注意,我修改了我的回答。
我没有更好的事情可做,所以我决定在这里对不同的方法进行性能测试。你可能会觉得有趣:pastie.org/10940329
如果你的意思是打印1
,2
等等,那似乎不如使用字符串高效。让我们看一个答案!
在我的基准测试中,使用打印操作比使用临时字符串的方法略微更高效。但是each_with_object
的效率更高。