すべき配列は、これを行うには、より効率的で、より多くのルビーっぽい方法はおそらくあります:あなたはパッドは、特定のサイズ
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
return a if n <= a.length
return padleft([x] + a, n, x)
end
何を示唆していますか?
すべき配列は、これを行うには、より効率的で、より多くのルビーっぽい方法はおそらくあります:あなたはパッドは、特定のサイズ
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
return a if n <= a.length
return padleft([x] + a, n, x)
end
何を示唆していますか?
質問の誤解のために編集されました。私の答えの正式版は右側から詰まっていたが、質問は左側からそれをするように求めていた。私はそれに応じてそれを修正した。これは命名規則によるものです。 ljust
,rjust
はString
の方法に組み込まれており、その慣例をArray
に拡張しましたが、それはそれぞれ問題用語でpadright
とpadleft
に相当します。
破壊的な方法
def padleft!(a, n, x)
a.insert(0, *Array.new([0, n-a.length].max, x))
end
def padright!(a, n, x)
a.fill(x, a.length...n)
end
Array
クラスに定義されているために、より自然になります:
class Array
def rjust!(n, x); insert(0, *Array.new([0, n-length].max, x)) end
def ljust!(n, x); fill(x, length...n) end
end
非破壊方法
def padleft(a, n, x)
Array.new([0, n-a.length].max, x)+a
end
def padright(a, n, x)
a.dup.fill(x, a.length...n)
end
または
class Array
def rjust(n, x); Array.new([0, n-length].max, x)+self end
def ljust(n, x); dup.fill(x, length...n) end
end
*演算子を使用してリストを繰り返します。あなたが詰めているものであることをにパッドまでの長さのため10
、および'x'
を使用して
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
return a if n <= a.length
return [x] * (n - a.length) + a
end
Woops。編集上の良い呼び出し: –
に、これは右パッド:
>> asdf = %w[0 1 2 3 ] #=> ["0", "1", "2", "3"]
>> asdf += (asdf.size < 10) ? ['x'] * (10 - asdf.size) : [] #=> ["0", "1", "2", "3", "x", "x", "x", "x", "x", "x"]
または
>> asdf = (asdf.size < 10) ? ['x'] * (10 - asdf.size) + asdf : asdf #=> ["x", "x", "x", "x", "x", "x", "0", "1", "2", "3"]
が
をpadleftしますモンキーパッチにあなたが意味をなさない場合Array:
class Array
def pad_right(s, char=nil)
self + [char] * (s - size) if (size < s)
end
def pad_left(s, char=nil)
(size < s) ? [char] * (s - size) + self : self
end
end
%w[1 2 3].pad_right(5, 'x') # => ["1", "2", "3", "x", "x"]
%w[1 2 3].pad_left(5, 'x') # => ["x", "x", "1", "2", "3"]
FWIW:
def rpad(item, padding, num)
Array(item).fill padding, Array(item).size, num
end
# rpad "initialize value(s)", 0, 3
# => ["initialize value(s)", 0, 0, 0]
ここでそれを行うには、別の楽しいワンライナーです:
(非破壊)
def padleft(a, n, x)
a.dup.reverse.fill(x, a.length..n-1).reverse
end
(破壊)
def padleft(a, n, x)
a.reverse.fill(x, a.length..n-1).reverse
end
ちょうど興味深い、なぜdownvotes?これはもはや正しい解決策ではありませんか? –
申し訳ありませんが、私はdownvoting中にシノプシスを書くことを意図しましたが、いくつかのことが思い浮かびました。使用されている文字列関数を扱う場合、2xを逆にすることは決して適切な解決策ではありません。このようなコードは、オープンソースソフトウェアのほとんどの減速の根源です。 コア・ストリング・ライブラリーにこのようなコードがある場合、誰かが一度の再割り振りとループを使用して書き換えて、パディング文字を設定し、ブログでそれを自慢します。 – nurettin
それは非効率的かもしれませんが、これは魅力的なコードです。 Rubyを書くとき、私たちはしばしば実用以上の詩を評価します。それは大規模なループで行われていない限り、私は良いと思う。 – superluminary
おそらくよりRubyish;)
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
(n - a.size).times.inject(a) do |array, i|
array << x
end
end
あなたがレールを使用して、右側にパディングをしたい場合:
[1,2,3,4,5,6].in_groups_of(4)
=> [[1, 2, 3, 4], [5, 6, nil, nil]]
これはどこにでも答えるの近くに来ません質問ですが、それは私がこのページに行った後に必要となったものです。誰かを助けることを願っています。
+1。私は 'fill'について忘れてしまった。 –