2010-05-12 5 views
6

Cho số nguyên tối thiểu và số nguyên tối đa, tôi muốn tạo một mảng tính từ mức tối thiểu đến tối đa hai, sau đó quay xuống (một lần nữa bằng hai , lặp lại số lượng tối đa). Ví dụ: nếu số tối thiểu là 1 và số tối đa là 9, tôi muốn [1, 3, 5, 7, 9, 9, 7, 5, 3, 1].Làm thế nào để tạo danh sách các số và nối ngược với số nguyên một cách hiệu quả trong Ruby

Tôi đang cố gắng súc tích nhất có thể, đó là lý do tôi sử dụng một bộ lót.

Trong Python, tôi sẽ làm điều này:

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

Trong Ruby, mà tôi chỉ mới bắt đầu để tìm hiểu, tất cả tôi đã đi lên với cho đến nay là:

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

nào công trình, nhưng tôi biết có phải là một cách tốt hơn. Nó là gì?

Trả lời

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

Nhưng ngắn hơn sẽ

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

nếu chúng tôi đang chơi golf :)

+0

Oh, làm thế nào tôi có thể quên 'Phạm vi # step'! –

+0

Phạm vi # bước dường như [mong đợi một khối] (http://ruby-doc.org/core/classes/Range.html#M000695) - ví dụ đầu tiên, trong khi nếu không chính xác những gì tôi đã hy vọng, là ném một lỗi cho tôi. ('không chặn (LocalJumpError)') – Kiwi

+1

@Kiwi: Bạn đang sử dụng Ruby 1.8.6. Nâng cấp lên 1.8.7+ hoặc 'bao gồm" backports "' –