Один вкладыш для ограничения массива слов до N символов в Ruby? - PullRequest
3 голосов
/ 10 августа 2010

Какой самый простой способ ограничить массив слов так, чтобы результирующий массив, когда слова объединялись, был меньше 40 символов? Что-то, что действует так:

words = ["ruby", "rails", "jquery", "javascript", "html"]
words.join.length #=> 29
words.join(", ").length #=> 37
words = ["ruby", "rails", "jquery", "javascript", "html", "css", "api"]
words.join.length #=> 35
words.join(", ").length #=> 47
words.chunk(:max_chars => 40) #=> ["ruby", "rails", "jquery", "javascript", "html"]

Обновление

Получил это до сих пор:

def chop(array, separator = "", max = 40)
  result = []
  array.each do |word|
    break if (result.join(separator).length + word.length > max)
    result << word 
    result
  end
  result
end

Ответы [ 4 ]

1 голос
/ 10 августа 2010
def chop(arr, sep = "", max = 40)
  max += sep.size
  arr.take_while{|x| (max -= x.size + sep.size) >= 0 }
end
1 голос
/ 10 августа 2010

Небольшое отклонение от вашего:

result = input.inject([]){|r,word|r<<word if r*separator+word.length < max}
1 голос
/ 10 августа 2010

Жаль, что есть условие ограждения, иначе это был бы намного более чистый код с take_while методом

def chop(array, separator = "", max_size = 40)
  so_far = 0
  sep = separator.size
  array.take_while{|word| (so_far += word.size + sep) <= max_size + sep }
end

Он проверяет, что он меньше или равен max_size + sep для компенсации того, что мы добавляем разделитель к каждому слову, даже если последнее не нуждается в нем.

1 голос
/ 10 августа 2010

Вот забавный способ, вам нужна активная поддержка:

require 'active_support'
class Array
  def chunk(sep = "", max = 40)
    self.inject([]){|m,n| (m+[n]).sum(&:size)+sep.size*m.size-1<max ? m<<n : m}
  end
end

Сейчас:

["ruby", "rails", "jquery", "javascript", "html", "css", "api"].chunk(", ") #=> ["ruby", "rails", "jquery", "javascript", "html"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...