class Array
def squeeze(n, &p)
p = Proc.new {|xs| xs.join} unless p
arr = self[0..n-2]
arr << p.call(self[n-1..-1])
end
end
a = ['a', 'b', 'c', 'd', 'e']
a.squeeze(3) # => ["a", "b", "cde"]
Требуется проверка границ, но вы поняли идею. Обратите внимание, что функция объединения может быть задана в качестве аргумента блока:
[1, 2, 3, 4].squeeze(3) {|xs| xs.inject {|acc,x| acc+x}} # => [1, 2, 7]