2011-07-09 1 views
1

私は現在、難読化された短いマンデルブロセットコードを1つのライナーにすることを試みていますが、私はそうすることに多くの問題があります。 \これをRubyのワンライナーに変換する

これはoriginally written in Pythonでしたが、Pythonの制限により、コードを1行に圧縮できませんでした。だから私はRubyを試してみるつもりです。私は言語に精通していますが、私はブロックを使用することにあまり熟練していません - それは私が問題を抱えている場所です。

とにかく、私は "変換" するコードは、私が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] 

は...ある

エラーがスローされます
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 

これを並べ替えた後、さらに1行に短縮したいと思います。どの私は...ここに

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

問題:

  • Rubyの条件式はブール値ではなく、1または0を返す、と!あなたは[X、1]

であなたは、インデックス文字列に必要は1.8.xと1.9.xで動作するように

  • それを印刷する前にSをつかうれた優先度の高い
  • を持っており、ここにあります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の最初の論理否定(nilfalse以外は真)を実行してから、false%40を評価しようとするため、!q%40が原因です。また、ゼロがfalseと評価されると仮定しているように見えますが、そうではありません。その後、k.abs<2と同様にi<15がboolen値(`*': true can't be coerced into Fixnum)と評価されるため、次の問題はwhileループの条件になります。これにより、あなたが始められるはずです...

    1

    ここには複数行のバージョンがあります。 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] 
    } 
    
    関連する問題