2016-05-31 5 views
-2

、それはRubyを使用して階段を印刷する最良の方法は何ですか?私は階段を印刷する方法を書いて

 # 
    ## 
    ### 
    #### 
##### 
###### 

のようにこれは、6行の階段があるだろう。だから私はこのコードを思いついた:

def print_staircase(num_rows) 
    for i in (1..num_rows) 
    puts ' ' * (num_rows-i) + '#' * i 
    end 
end 

print_staircase(6) 
=> 
    # 
    ## 
    ### 
    #### 
##### 
###### 

それはうまくいくが、私はこれは非効率的な、より良い解決策だと思う?

NUM_ROWSが大きいので、我々は' ' * (n-i) + '#' * iようにするたびに結果を構築する場合は、私はこれは良いアイデアではないと思うので!

+1

なぜあなたはそれがハックだと思いますか? –

+0

@JanDvorak申し訳ありませんが、実際には非効率的です。私のアップデートをチェックしてください! –

+0

私はそれが非効率だとは思わない。また、この場合、実際にはパフォーマンスは必要ありません。 –

答えて

3

あなたは一度の初期文字列を作成し、各反復で#を設定できます

def print_staircase(num_rows) 
    str = ' ' * num_rows 
    1.upto(num_rows) do |i| 
    str[-i] = '#' 
    puts str 
    end 
end 

この再使用していますstr代わりに新しい文字列インスタンスを毎回作成します。

しかし、通常、あなたはこのような何かを参照します:

def print_staircase(num_rows) 
    1.upto(num_rows) { |i| puts ('#' * i).rjust(num_rows) } 
end 
1

あなたは最初は空の文字列に等しい変数を定義する必要があります。それからサイクルで常にそれに '#'を加えてそれを表示します。これは各繰り返しの後に現在の値を保存し、各反復でゼロから再計算するのではなく、文字列に単一の '#'を追加する必要があります。

1

これを行うには多くの方法がありますが、あなたは一つの解決策であり、それは私には罰金です。 2つの追加ソリューションとベンチマークを実装した場合。あなたのソリューションは3つの中で最高速でした(マイクロベンチマークの免責事項が適用されます、特に私がputs/printでIOを行うため)。

def staircase_0(size) 
    string = ' ' * (size - 1) + '#' * size 
    size.times do |offset| 
    puts string[offset...(offset + size)] 
    end 
end 

def staircase_1(size) 
    prefix = ' ' * (size - 1) 
    postfix = '#' 
    size.times do 
    print prefix 
    puts postfix 
    prefix = prefix[1..-1] 
    postfix += '#' 
    end 
end 


def staircase_2(num_rows) 
    for i in (1..num_rows) 
    puts ' ' * (num_rows-i) + '#' * i 
    end 
end 


require 'benchmark/ips' 

Benchmark.ips do |x| 
    x.report('_0') do 
    staircase_0(6) 
    end 
    x.report('_1') do 
    staircase_1(6) 
    end 
    x.report('_2') do 
    staircase_2(6) 
    end 
    x.compare! 
end 

と結果:

Comparison: 
        _2: 35649.0 i/s 
        _0: 29716.3 i/s - 1.20x slower 
        _1: 25848.2 i/s - 1.38x slower 

ためIOの結果は多くの異なる場合がありますのでご注意ください。 IOは遅いです(したがってアルゴリズムと文字列の連結がより重くなります)。また、予測可能ではなく、実行ごとに異なる場合があります。

def staircase_3(size) 
    string = '' 
    size.times do |index| 
    string += ' ' * (size - index - 1) + '#' * (index + 1) + "\n" 
    end 
    puts string 
end 

そして、私はベンチマークを実行したときに確かにそれは速いです:

Comparison: 
        _3: 52923.7 i/s 
        _0: 36377.7 i/s - 1.45x slower 
        _2: 33508.7 i/s - 1.58x slower 
        _1: 25991.6 i/s - 2.04x slower 

はまた、この実行であることに注意(ランタイムの点で)より効率的なソリューションは、したがって、ただ1つの文字列を出力するかもしれませんあなたのアルゴリズムのバージョン(staircase_2)は、IOのためにstaircase_0 ...より遅いです。しかし、すべての私の試合でstaircase_3が最速だった。

+0

よろしくお願いします。 –

+0

@HieuPham別の解決策を追加するために私の答えを更新しました。 –

+0

ありがとう、私もあなたのソリューション、偉大な貢献の男を確認する、私は本当にこれを感謝します:) –

関連する問題