2011-07-09 95 views
1

我目前正在嘗試將混淆的,短的mandelbrot集代碼放入一行,但這樣做時遇到了很多麻煩。 \將此轉換爲Ruby單線程

這是originally written in Python,但由於Python的限制,我無法將代碼壓縮到一行。所以現在我要去嘗試Ruby。我對這門語言很熟悉,但我並不擅長使用塊 - 這是我遇到問題的地方。

不管怎樣,我要 「轉換」 的代碼是

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的過程中。所以如果任何人都可以向我解釋什麼是拋出這些錯誤,那就太好了。

+0

我不能再現'no block given'錯誤。 –

回答

2
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] 
} 

問題我處理:

  • 紅寶石條件語句返回布爾值,而不是1或0,和!在打印
  • 要在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] 
    } 
    
  • +0

    Python的打印映射到Ruby的puts。 此外,在Python中,False爲0,True爲1,因此2 *(i <15)的意思是評估爲0或2。 –

    +0

    我實際上是想像Ross一樣分別完成它們。 –

    +0

    這很好,謝謝。我仍然試圖讓整個事情「可以推」,但不幸的是我超過了20個字符。 –

    1

    拳頭,擺脫each,該塊應該去與upto。一旦你這樣做,你會得到另一個錯誤:undefined method '%' for false:FalseClass。這是因爲!q%40,因爲優先級首先會做邏輯否定q(除nilfalse之外都是真的),然後嘗試評估false%40。你也似乎假設一個零將評估爲假,而事實並非如此。然後下一個問題將在您的while循環的條件下,因爲k.abs<2以及i<15評估爲boolean值(`*': true can't be coerced into Fixnum)。這應該讓你開始...

    1

    這是一個多行版本;隨意把它全部在一行:

    h,s='.;*&8#',''; 
    0.upto(800).each { |q| 
    (puts 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?1:0); 
    s+=h[i/3] 
    }