Robert Klemme wrote:
> On 21.11.2006 10:16, William James wrote:
> > Robert Klemme wrote:
> >> On 21.11.2006 08:18, William James wrote:
> >>> Li Chen wrote:
> >>>> Hi all,
> >>>>
> >>>> I want to build a new array from an old one with every element being
> >>>> duplicated except the first and last element. And here are my codes. I
> >>>> wonder if this is a real Ruby way to do it.
> >>>>> array=[1,2,3,4,5,6,7,8,9,10]
> >>> => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> >>>>> array.zip(array).flatten[1..-2]
> >>> => [1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
> >> That's cute!  I have another one with #inject (of course):
> >>
> >> irb(main):007:0> arr=(1..10).to_a
> >> => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> >> irb(main):008:0> copy=[]
> >> => []
> >> irb(main):009:0> arr.inject{|a,b| copy << a << b; b}
> >> => 10
> >> irb(main):010:0> copy
> >> => [1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
> >
> > This demonstrates an excellent understanding of inject and
>
> Thank you!
>
> > is a good way to eliminate the somewhat ugly [1..-2].
>
> Well, you can use [1...-1] instead. :-)

Ha, ha.  Also ugly.

>
> > Here's a prolix way of avoiding array indexing while using zip:
> >
> > copy=arr.dup; copy.shift; copy.pop
> > arr.zip(copy).flatten.compact
>
> You can copy and reduce in one step:
>
>  >> arr=(1..10).to_a
> => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>  >> arr.zip(arr[1...-1]).flatten.compact
> => [1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
>
> Or, more efficient
>
>  >> arr.zip(arr[1...-1]).flatten!.compact!
> => [1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]

But it has "[1...-1]"!  Indexing with literal numbers is so horrid.

> 
> Cheers
> 
> 	robert