我目前正在尝试将我混淆的、简短的 mandelbrot 集代码变成一个单行代码,但我在这样做时遇到了很多麻烦。\
它是 originally written in Python ,但由于 Python 的限制,我无法将代码压缩到一行。所以现在我要试试 Ruby。我熟悉这门语言,但我不太擅长使用 block ——这就是我遇到的问题。
不管怎样,我要“转换”的代码是
for q in range(801):
if q%40==0:print s;s=''
i,k=0,0
while(abs(k)<2*(i<15)):k,i=k**2+complex(q%40*.075-2,q/40*-.1+1),i+1
s+=h[i/3]
我试图用 Ruby 重写...
h,s='.;*&8#',''
0.upto(800).each {|q|
if !q%40
s=''
p s
end
i,k=0,0
while(k.abs<2*(i<15))
k,i=k**2+Complex(q%40*0.075-2,q/40*-0.1+1),i+1
end
s+=h[i/3]
}
抛出错误
Line 2:in `upto': no block given (LocalJumpError)
from t.rb:2
整理后,我想将其进一步缩短为一行。我从这里开始...
h,s='.;*&8#','';0.upto(800).each {|q| if !q%40 then s='';p s end;i,k=0,0;while(k.abs<2*(i<15))do k,i=k**2+Complex(q%40*0.075-2,q/40*-0.1+1),i+1 end}
但无论如何,我这样做只是为了好玩,并希望在此过程中学到更多的 Ruby。因此,如果有人能向我解释是什么引发了这些错误,那就太好了。
最佳答案
require 'complex'
h,s='.;*&8#',''
0.upto(800).each {|q|
if q%40 == 0
p s
s=''
end
i,k=0,0
while(k.abs<2 && (i<15))
k,i=k**2+Complex(q%40*0.075-2,q/40*-0.1+1),i+1
end
s+=h[i/3, 1]
}
我处理过的问题:
- Ruby 条件语句返回 bool 值,而不是 1 或 0,并且 !具有高优先级
- 你在打印它之前破坏了 s
- 要在 1.8.x 和 1.9.x 上工作,您需要使用 [x, 1] 索引字符串
在这里它被重新安排了一点作为一个更好的单行起点:
require 'complex'
h,s='.;*&8#',''
800.times { |q|
(p s; s='') if q%40 == 0
i,k=0,0
k,i=k**2+Complex(q%40*0.075-2,q/40*-0.1+1),i+1 while k.abs<2 && i<15
s+=h[i/3, 1]
}
关于ruby - 将其转换为 Ruby 单行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635684/