Ruby 圣诞快乐!Ruby 如何用一句循环实现多个循环?

bingo8671 · 2018年12月25日 · 最后由 sevk 回复于 2018年12月26日 · 1703 次阅读

今天在微博看到大佬用 python 发的代码圣诞树,很简洁,想用 ruby 改一下,结果做不到 python 那样的简洁,求解答。

python2 -c "for i in range(0,5)+range(2,8)+range(3,12)+[2,2]:print' '*(40-2*i-i/2)+'*'*(4*i+1+i)" ​​​​

写成 python 脚本是:

for i in range(0,5)+range(2,8)+range(3,12)+[2,2,2,2]:
    print' '*(40-2*i-i/2)+'*'*(4*i+1+i)

写成 ruby 脚本是:

for i in (0..5) do
    print' '*(40-2*i-i/2)+'*'*(4*i+1+i)+"\n"
end
for i in (2..8) do
    print' '*(40-2*i-i/2)+'*'*(4*i+1+i)+"\n"
end
for i in (3..12) do
    print' '*(40-2*i-i/2)+'*'*(4*i+1+i)+"\n"
end
for i in [2, 2, 2, 2] do
    print' '*(40-2*i-i/2)+'*'*(4*i+1+i)+"\n"
end

哪位大佬能帮忙简化一下,ruby 好像不能一个 for 语句实现多个循环吗?

简单的 range to_a 相加不就可以了

quakewang 回复

感谢解答,可以实现功能。不过有点不明白 *0..5 里面的 * 是什么作用,为什么这么用呀,麻烦讲解一下。

bingo8671 回复

splat operator 有一种翻译是打散 效果在控制台敲一下就懂了

[1] pry(main)> [*0..5]
=> [0, 1, 2, 3, 4, 5]

来个 Pg 版

WITH rows(i) AS (
  SELECT generate_series(0,5) 
  UNION ALL 
  SELECT generate_series(2,8) 
  UNION ALL
  SELECT generate_series(3,12) 
  UNION ALL 
  SELECT unnest(array[2,2,2,2])
) 
SELECT repeat(' ', (40- 2*i - i/2)) || repeat('*', (4*i + 1 + i)) AS tree FROM rows;

pg 版 == 炮哥版。外号难道是这么来的吗?😃

quakewang 回复
ruby -e "[*0..5, *2..8, *3..12, 2, 2, 2, 2].each{|i| puts ' '*(40-2*i-i/2)+'*'*(4*i+1+i)}"
bingo8671 关闭了讨论。 12月26日 09:42
需要 登录 后方可回复, 如果你还没有账号请 注册新账号