これを行うには多くの方法がありますが、あなたは一つの解決策であり、それは私には罰金です。 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
が最速だった。
なぜあなたはそれがハックだと思いますか? –
@JanDvorak申し訳ありませんが、実際には非効率的です。私のアップデートをチェックしてください! –
私はそれが非効率だとは思わない。また、この場合、実際にはパフォーマンスは必要ありません。 –