ruby - 将其转换为 Ruby 单行代码

标签 ruby

我目前正在尝试将我混淆的、简短的 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/

相关文章:

Ruby: bool 属性命名约定和使用

mysql - 从 SQL Server 高效更新 MySQL 表

ruby - ||=(或等于)在 Ruby 中是什么意思?

mysql - 切换到 Ruby 1.9.1 后 Rails mysql 类型错误

ruby - 绝对初学者的单元测试 - 我正在使用 Ruby

ruby - 缺少数字类和方法

ruby - Rails3 : combine scope with OR

ruby-on-rails - mini_portile 安装在 Digitalocean 上卡住

ruby-on-rails - 在 Sinatra 中使用 ActionMailer,使用邮件方法接收 nil 对象

ruby-on-rails - Ruby on Rails 创建和访问 MySQL 变量