2010-05-12 6 views
6

Dado un entero mínimo y máximo entero, quiero crear una matriz que cuente del mínimo al máximo en dos, luego retroceda (nuevamente en dos , repitiendo el número máximo).Cómo crear una lista de números y anexarla inversamente de manera eficiente en Ruby

Por ejemplo, si el número mínimo es 1 y el máximo es 9, quiero [1, 3, 5, 7, 9, 9, 7, 5, 3, 1].

Estoy tratando de ser lo más conciso posible, razón por la cual estoy usando one-liners.

En Python, me gustaría hacer esto:

range(1, 10, 2) + range(9, 0, -2) 

En Rubí, que estoy empezando a aprender, todo lo que he encontrado hasta el momento es:

(1..9).inject([]) { |r, num| num%2 == 1 ? r << num : r }.reverse.inject([]) { |r, num| r.unshift(num).push(num) } 

Qué funciona, pero sé que hay debe ser una mejor manera. ¿Qué es?

Respuesta

6
(1..9).step(2).to_a + (1..9).step(2).to_a.reverse 

Pero más corto sería

Array.new(10) { |i| 2 * [i, 9-i].min + 1 } 

si estamos golf código :)

+0

Oh, cómo podría olvidar 'Range # step'! –

+0

El intervalo # paso parece [esperar un bloqueo] (http://ruby-doc.org/core/classes/Range.html#M000695) - el primer ejemplo, mientras que de otro modo era exactamente lo que esperaba, arroja un error para mi. ('no hay bloque dado (LocalJumpError)') – Kiwi

+1

@Kiwi: Estás usando Ruby 1.8.6. Actualice a 1.8.7+ o 'incluya" backports "' –

Cuestiones relacionadas