2011-04-10 7 views
11

すべき配列は、これを行うには、より効率的で、より多くのルビーっぽい方法はおそらくあります:あなたはパッドは、特定のサイズ

# 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 

何を示唆していますか?

答えて

22

質問の誤解のために編集されました。私の答えの正式版は右側から詰まっていたが、質問は左側からそれをするように求めていた。私はそれに応じてそれを修正した。これは命名規則によるものです。 ljust,rjustStringの方法に組み込まれており、その慣例をArrayに拡張しましたが、それはそれぞれ問題用語でpadrightpadleftに相当します。

破壊的な方法

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 
+0

+1。私は 'fill'について忘れてしまった。 –

1

*演算子を使用してリストを繰り返します。あなたが詰めているものであることをにパッドまでの長さのため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 
+0

Woops。編集上の良い呼び出し: –

4

に、これは右パッド:

>> 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"] 
4

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

ここでそれを行うには、別の楽しいワンライナーです:

(非破壊)

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 
+0

ちょうど興味深い、なぜdownvotes?これはもはや正しい解決策ではありませんか? –

+1

申し訳ありませんが、私はdownvoting中にシノプシスを書くことを意図しましたが、いくつかのことが思い浮かびました。使用されている文字列関数を扱う場合、2xを逆にすることは決して適切な解決策ではありません。このようなコードは、オープンソースソフトウェアのほとんどの減速の根源です。 コア・ストリング・ライブラリーにこのようなコードがある場合、誰かが一度の再割り振りとループを使用して書き換えて、パディング文字を設定し、ブログでそれを自慢します。 – nurettin

+1

それは非効率的かもしれませんが、これは魅力的なコードです。 Rubyを書くとき、私たちはしばしば実用以上の詩を評価します。それは大規模なループで行われていない限り、私は良いと思う。 – superluminary

1

おそらくより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

あなたがレールを使用して、右側にパディングをしたい場合:

[1,2,3,4,5,6].in_groups_of(4) 
=> [[1, 2, 3, 4], [5, 6, nil, nil]] 

これはどこにでも答えるの近くに来ません質問ですが、それは私がこのページに行った後に必要となったものです。誰かを助けることを願っています。

関連する問題