2015-04-19 18 views

risposta

5
b.fill(b.size..a.size - 1) { [0, 0] } 
+1

Buona risposta. Non ero a conoscenza della forma di [Array # fill] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-fill) che utilizza un intervallo come argomento. È interessante che funzioni anche con 'b.size> a.size' (che suppongo sia una proprietà' Range'). Ovviamente potresti scrivere '(b.size ... a.size)'. –

4

A mio parere, questo è più leggibile:

(a.length - b.length).times do 
    b << [0, 0] 
end 
+1

In termini di chiarezza, questa è la soluzione migliore fino ad ora. – Drenmi

2

mi piace fill, ma che sembra essere stato preso. Ecco un modo per restituire la matrice desiderata senza mutare b. Che non è stato chiesto per, ma potrebbe essere utile in alcune applicazioni:

Array.new(a.size) { |i| b[i] || [0,0] } 
    #=> [[1, 81], [0, 0], [0, 0]] 

Si potrebbe, naturalmente, mettere b = di fronte.

Un altro modo in-posto è:

b.concat [[0,0]]*(a.size-b.size) 

Hey, questo è divertente. Un altro (fatti salvi elementi di b uguale nil):

a.each_index { |i| b[i] ||= [0,0] } 
b 
+0

'Se b deve essere modificato sul posto, mettere b = in primo piano. - Questo non è a posto, è riassegnazione. –

+0

Sei corretto. Grazie. Ho fatto una modifica. –

4

Non il più efficiente, ma abbastanza leggibile:

b << [0,0] until a.size == b.size 

Un po 'più efficiente:

b.concat [[0,0]] * (a.size-b.size) 
1

vorrei appendwhile la dimensione è più piccola, perché penso che sia piacevole:

a = [[1, 2], [22, 11], [18, 9]] 
b = [[1, 81]] 

b << [0, 0] while b.size < a.size 

b #=> [[1, 2], [0, 0], [0, 0]] 
Problemi correlati