2013-05-13 73 views

Trả lời

5

Bạn có thể sử dụng Viết tắt trong thư viện chuẩn

require 'abbrev' 
s = Abbrev::abbrev(['string']).keys 
puts s.inspect 

tôi phải thêm cách nào khác để sử dụng này sau khi yêu cầu Viết tắt thư viện, với phương thức .abbrev được thêm vào Array:

require 'abbrev' 
s = ['string'].abbrev.keys 
puts s.inspect 

Nếu thứ tự quan trọng đối với sự trở lại của bạn trong câu hỏi, chỉ cần gọi .sort trên keys.

+1

@ user21033168, xin lỗi, nhưng thú vị vì nó là để biết về thư viện này (cá nhân tôi không biết nó, nhờ @vgoff) Tôi không thấy làm thế nào một giải pháp đòi hỏi phải sử dụng 'sort' và các đối tượng trung gian nên được lựa chọn của bất kỳ người nào trong số những người khác làm một bản đồ đơn giản, ví dụ như của Sergio. – tokland

+0

@tokland Tôi thực sự không cần .sort, vì vậy tôi chỉ thích sự ngắn gọn của giải pháp này với% w {string} .abbrev.keys :) – user21033168

+1

đủ công bằng, mặc dù nó sẽ có một chút gây hiểu lầm cho người đọc SO trong tương lai đang tìm kiếm chính xác những gì bạn đã hỏi, "inits" (như Haskell gọi nó) của một chuỗi trong Ruby. – tokland

12

Làm thế nào về điều này?

s = 'string' 
res = s.length.times.map {|len| s[0..len]} 
res # => ["s", "st", "str", "stri", "strin", "string"] 
+1

+1 cho không sử dụng bất kỳ các module khác cho một nhiệm vụ đơn giản như vậy. –

6

Các tường thuật nhiều hơn tôi có thể đưa ra:

s = "string" 
1.upto(s.length).map { |len| s[0, len] } 
#=> ["s", "st", "str", "stri", "strin", "string"] 
+0

Tôi cũng nhận được một số :) –

+0

@Sergio. Vâng, tôi thấy, rõ ràng là một 'bản đồ' đơn giản bị cấm thực hiện điều này. Bất cứ điều gì. – tokland

+0

Nó không phải là tôi đã downvoted một trong hai bạn, họ là giải pháp tốt :) – user21033168

0

biến thể khác (điều này sẽ bao gồm các chuỗi rỗng trong kết quả):

s.each_char.inject([""]) {|a,ch| a << a[-1] + ch} 

này

  • bắt đầu với một mảng chứa các chuỗi rỗng [""]
  • cho mỗi ch char trong chuỗi, nối thêm ch vào kết quả cuối cùng a[-1] + ch
  • thêm kết quả này vào mảng kết quả
+0

Điều này tạo ra một chuỗi rỗng là kết quả đầu tiên. –

+0

Tôi nhận được '[" "," s "," st "," str "," stri "," strin "," string "]' trong Ruby 1.9. Một chút phức tạp trong mọi trường hợp. – tokland

5
s.chars.zip.inject{ |i,j| i << i.last + j.first } 
+0

Đây thực sự là giải pháp yêu thích của tôi, bởi vì nó không tham chiếu đến * s * trong chuỗi phương pháp và nó thông minh. – user21033168

0
s = "string" 
s.each_char.with_object([""]){|i,ar| ar << ar[-1].dup.concat(i)}.drop(1) 
#=> ["s", "st", "str", "stri", "strin", "string"] 
Các vấn đề liên quan