'string'到['s','st','str','stri','strin','string']

时间:2013-05-13 08:59:55

标签: ruby

最优雅的做法是什么

'string'
=> ['s', 'st', 'str', 'stri', 'strin', 'string']

我一直试图想到一个班轮,但我不能完全到达那里 欢迎任何解决方案,谢谢。

6 个答案:

答案 0 :(得分:12)

这个怎么样?

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

答案 1 :(得分:6)

我能提出的声明越多:

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

答案 2 :(得分:5)

您可以在标准库中使用Abbrev

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

我必须在需要Abbrev库后添加另一种方法来使用它,并将.abbrev方法添加到Array:

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

如果订单与问题中的回报相符非常重要,请拨打.sort上的keys

答案 3 :(得分:5)

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

答案 4 :(得分:0)

另一个变体(这将在结果中包含空字符串):

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

  • 以包含空字符串[""]
  • 的数组开头
  • 对于字符串中的每个字符ch,将ch附加到最后一个结果a[-1] + ch
  • 将此添加到结果数组

答案 5 :(得分:0)

s = "string"
s.each_char.with_object([""]){|i,ar| ar << ar[-1].dup.concat(i)}.drop(1)
#=> ["s", "st", "str", "stri", "strin", "string"]