[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

filling an array excepted first and last position...

Josselin

10/20/2006 8:00:00 AM

ldom = 30 # variable (last day of a month...)

# array init to 0
@obk = []
1.step(ldom, 1) do |i|
@obk[i] = 0
end

I am filling an array as follows (part of a larger filling scheme) :
----
#fiiling the array upon another array content
# but I'd like to AVOID filling the first and last position in this loop....
obdays.each do |bd|
@obk[bd] = 1
end
------
# ajusting first and last position (in the larger scheme)
@obk[obdays.first] += -1
@obk[obdays.last] += -2


11 Answers

Rimantas Liubertas

10/20/2006 8:27:00 AM

0

> ldom = 30 # variable (last day of a month...)
>
> # array init to 0
> @obk = []
> 1.step(ldom, 1) do |i|
> @obk[i] = 0
> end

Why not:

@obk = Array.new(ldom,0)


> I am filling an array as follows (part of a larger filling scheme) :
> ----
> #fiiling the array upon another array content
> # but I'd like to AVOID filling the first and last position in this loop....
> obdays.each do |bd|
> @obk[bd] = 1
> end
<...>

Not sure what are you trying to do here, but maybe something like this
may suit you?

@obk.fill(1,ldom-1){|i| obdays[i]}


Regards,
Rimantas
--
http://rim...

Peter Szinek

10/20/2006 8:28:00 AM

0

Josselin wrote:
> ldom = 30 # variable (last day of a month...)
>
> # array init to 0
> @obk = []
> 1.step(ldom, 1) do |i|
> @obk[i] = 0
> end

You could do also
@obk = Array.new(ldom) { 0 }
>
> I am filling an array as follows (part of a larger filling scheme) :
> ----
> #fiiling the array upon another array content
> # but I'd like to AVOID filling the first and last position in this
> loop....
> obdays.each do |bd|
> @obk[bd] = 1
> end

hmm... there are maybe better ways for this, but I would try:

(1..@obd.size-2).each {|i| puts @obk[i] }

HTH,
Peter
http://www.rubyra...


Robert Klemme

10/20/2006 8:32:00 AM

0

On 20.10.2006 09:59, Josselin wrote:
> ldom = 30 # variable (last day of a month...)
>
> # array init to 0
> @obk = []
> 1.step(ldom, 1) do |i|
> @obk[i] = 0
> end

@obk = Array.new(ldom, 0)

> I am filling an array as follows (part of a larger filling scheme) :
> ----
> #fiiling the array upon another array content
> # but I'd like to AVOID filling the first and last position in this
> loop....
> obdays.each do |bd|
> @obk[bd] = 1
> end
> ------
> # ajusting first and last position (in the larger scheme)
> @obk[obdays.first] += -1
> @obk[obdays.last] += -2

I am not exactly sure what problem you have with this approach. Here is
a different one

obdays.each_with_index do |bd, idx|
case idx
when 0
# ignore, @obk[bd] is 0 already
when obdays.length - 1
# set to 1 + (-2) = -1
@obk[bd] = -1
else
@obk[bd] = 1
end
end

Does that help?

robert

Tomasz Wegrzanowski

10/20/2006 8:54:00 AM

0

On 10/20/06, Josselin <josselin@wanadoo.fr> wrote:
> ldom = 30 # variable (last day of a month...)
>
> # array init to 0
> @obk = []
> 1.step(ldom, 1) do |i|
> @obk[i] = 0
> end
>
> I am filling an array as follows (part of a larger filling scheme) :
> ----
> #fiiling the array upon another array content
> # but I'd like to AVOID filling the first and last position in this loop....
> obdays.each do |bd|
> @obk[bd] = 1
> end

How about:
@obk = Array.new(ldom, 0)
obdays[1..-2].to_a.each{|bd| @obk[bd] = 1}

to_a just in case obdays is empty, in which case obdays[1..-2] return nil.
I don't know why Array#[] with a range cannot just always return [].

And don't worry about creating a new object,
obdays and obdays[1..-2] actually share storage.

--
Tomasz Wegrzanowski [ http://t-a-w.blo... ]

Josselin

10/20/2006 10:28:00 AM

0

On 2006-10-20 09:59:58 +0200, Josselin <josselin@wanadoo.fr> said:

> ldom = 30 # variable (last day of a month...)
>
> # array init to 0
> @obk = []
> 1.step(ldom, 1) do |i|
> @obk[i] = 0
> end
>
> I am filling an array as follows (part of a larger filling scheme) :
> ----
> #fiiling the array upon another array content
> # but I'd like to AVOID filling the first and last position in this loop....
> obdays.each do |bd|
> @obk[bd] = 1
> end
> ------
> # ajusting first and last position (in the larger scheme)
> @obk[obdays.first] += -1
> @obk[obdays.last] += -2

thanks to all of you, i'll try all your clues...
Ruby is incredible... you can writing as in any C, C++, java multi
lines routine.. then shrink it to a minimal line... that's why newbie
ask for well-trained support at first then may require guru help !!

Josselin

10/20/2006 10:43:00 AM

0

On 2006-10-20 10:26:50 +0200, "Rimantas Liubertas" <rimantas@gmail.com> said:

>> ldom = 30 # variable (last day of a month...)
>>
>> # array init to 0
>> @obk = []
>> 1.step(ldom, 1) do |i|
>> @obk[i] = 0
>> end
>
> Why not:
>
> @obk = Array.new(ldom,0)

yes , it's better .... avoiding @obk[0] = nil in my writing...
>
>
>> I am filling an array as follows (part of a larger filling scheme) :
>> ----
>> #fiiling the array upon another array content
>> # but I'd like to AVOID filling the first and last position in this loop....
>> obdays.each do |bd|
>> @obk[bd] = 1
>> end
> <...>
>
> Not sure what are you trying to do here, but maybe something like this
> may suit you?
>
> @obk.fill(1,ldom-1){|i| obdays[i]}
obdays are all days in a given period in a month (ex : 2 to 6 november)
I need to fill @obk[3] = 1 ...... @obk[5] = 1 # booked
but @obk[2] += -1 (in value) @obk[6] += -2 (out value)

why adding these values ?
because on november 6, I can also have late another booking period starting

so I will get
@obk[6] += 1 (in value)... in which case @obk[6] will be -3

finally I got my array for november from 1 to 30
Day 1 2 3 4 5 6 7 8 9 ......
value 0 -1 1 1 1 -3 1 1 1 .....
these values are used in a javascript calendar to fix the CSS class for display
0 no booking color
-1 half day starting
1 booked day
-3 half day ending / half day starting
...
-2 half day ending

that's it....

>
>
> Regards,
> Rimantas


Josselin

10/20/2006 11:35:00 AM

0

On 2006-10-20 10:32:18 +0200, Robert Klemme <shortcutter@googlemail.com> said:

> On 20.10.2006 09:59, Josselin wrote:
>> ldom = 30 # variable (last day of a month...)
>>
>> # array init to 0
>> @obk = []
>> 1.step(ldom, 1) do |i|
>> @obk[i] = 0
>> end
>
> @obk = Array.new(ldom, 0)
better , avoiding @obk[0] = nil ...
>
>> I am filling an array as follows (part of a larger filling scheme) :
>> ----
>> #fiiling the array upon another array content
>> # but I'd like to AVOID filling the first and last position in this loop....
>> obdays.each do |bd|
>> @obk[bd] = 1
>> end
>> ------
>> # ajusting first and last position (in the larger scheme)
>> @obk[obdays.first] += -1
>> @obk[obdays.last] += -2
>
> I am not exactly sure what problem you have with this approach. Here
> is a different one
>
> obdays.each_with_index do |bd, idx|
> case idx
> when 0
> # ignore, @obk[bd] is 0 already
> when obdays.length - 1
> # set to 1 + (-2) = -1
> @obk[bd] = -1
> else
> @obk[bd] = 1
> end
> end
>
> Does that help?
>
> robert

yes and no, I cannot test @obk[bd] == 0 as it may change.... as
indicated in one of my response post


Robert Klemme

10/20/2006 11:41:00 AM

0

On 20.10.2006 13:35, Josselin wrote:
> On 2006-10-20 10:32:18 +0200, Robert Klemme <shortcutter@googlemail.com>
> said:
>
>> On 20.10.2006 09:59, Josselin wrote:
>>> ldom = 30 # variable (last day of a month...)
>>>
>>> # array init to 0
>>> @obk = []
>>> 1.step(ldom, 1) do |i|
>>> @obk[i] = 0
>>> end
>>
>> @obk = Array.new(ldom, 0)
> better , avoiding @obk[0] = nil ...
>>
>>> I am filling an array as follows (part of a larger filling scheme) :
>>> ----
>>> #fiiling the array upon another array content
>>> # but I'd like to AVOID filling the first and last position in this
>>> loop....
>>> obdays.each do |bd|
>>> @obk[bd] = 1
>>> end
>>> ------
>>> # ajusting first and last position (in the larger scheme)
>>> @obk[obdays.first] += -1
>>> @obk[obdays.last] += -2
>>
>> I am not exactly sure what problem you have with this approach. Here
>> is a different one
>>
>> obdays.each_with_index do |bd, idx|
>> case idx
>> when 0
>> # ignore, @obk[bd] is 0 already
>> when obdays.length - 1
>> # set to 1 + (-2) = -1
>> @obk[bd] = -1
>> else
>> @obk[bd] = 1
>> end
>> end
>>
>> Does that help?
>>
>> robert
>
> yes and no, I cannot test @obk[bd] == 0 as it may change.... as
> indicated in one of my response post

??? There is no test for @obk[bd] == 0 in the code above. It's a bit
difficult to guess what you really want with the information I have seen.

Cheers

robert

Josselin

10/20/2006 11:47:00 AM

0

On 2006-10-20 10:54:24 +0200, "Tomasz Wegrzanowski"
<tomasz.wegrzanowski@gmail.com> said:

> On 10/20/06, Josselin <josselin@wanadoo.fr> wrote:
>> ldom = 30 # variable (last day of a month...)
>>
>> # array init to 0
>> @obk = []
>> 1.step(ldom, 1) do |i|
>> @obk[i] = 0
>> end
>>
>> I am filling an array as follows (part of a larger filling scheme) :
>> ----
>> #fiiling the array upon another array content
>> # but I'd like to AVOID filling the first and last position in this loop....
>> obdays.each do |bd|
>> @obk[bd] = 1
>> end
>
> How about:
> @obk = Array.new(ldom, 0)
> obdays[1..-2].to_a.each{|bd| @obk[bd] = 1}

interesting but when I enter this command obdays is already a range :

> obdays = > 2..6
so I want to do someting like that :
obdays[3..5].to_a.each{|bd| @obk[bd] = 1}
starting the position after the first in the range and ending with the
position before the last
like obdays[start+1..end-1].to_a.each{|bd| @obk[bd] = 1}
?

>
> to_a just in case obdays is empty, in which case obdays[1..-2] return nil.
> I don't know why Array#[] with a range cannot just always return [].
>
> And don't worry about creating a new object,
> obdays and obdays[1..-2] actually share storage.


Josselin

10/21/2006 6:30:00 AM

0

On 2006-10-20 13:40:44 +0200, Robert Klemme <shortcutter@googlemail.com> said:

> On 20.10.2006 13:35, Josselin wrote:
>> On 2006-10-20 10:32:18 +0200, Robert Klemme <shortcutter@googlemail.com> said:
>>
>>> On 20.10.2006 09:59, Josselin wrote:
>>>> ldom = 30 # variable (last day of a month...)
>>>>
>>>> # array init to 0
>>>> @obk = []
>>>> 1.step(ldom, 1) do |i|
>>>> @obk[i] = 0
>>>> end
>>>
>>> @obk = Array.new(ldom, 0)
>> better , avoiding @obk[0] = nil ...
>>>
>>>> I am filling an array as follows (part of a larger filling scheme) :
>>>> ----
>>>> #fiiling the array upon another array content
>>>> # but I'd like to AVOID filling the first and last position in this loop....
>>>> obdays.each do |bd|
>>>> @obk[bd] = 1
>>>> end
>>>> ------
>>>> # ajusting first and last position (in the larger scheme)
>>>> @obk[obdays.first] += -1
>>>> @obk[obdays.last] += -2
>>>
>>> I am not exactly sure what problem you have with this approach. Here
>>> is a different one
>>>
>>> obdays.each_with_index do |bd, idx|
>>> case idx
>>> when 0
>>> # ignore, @obk[bd] is 0 already
>>> when obdays.length - 1
>>> # set to 1 + (-2) = -1
>>> @obk[bd] = -1
>>> else
>>> @obk[bd] = 1
>>> end
>>> end
>>>
>>> Does that help?
>>>
>>> robert
>>
>> yes and no, I cannot test @obk[bd] == 0 as it may change.... as
>> indicated in one of my response post
>
> ??? There is no test for @obk[bd] == 0 in the code above. It's a bit
> difficult to guess what you really want with the information I have
> seen.
>
> Cheers
>
> robert

Thanks Robert, I solved the problem creating a sub-range without the
first and last position of the the initial range

other_booking_days = (bk.start_at.day..bk.end_at.day)

@obk[other_booking_days.first] += -1
obd = (bk.start_at.day+1..bk.end_at.day-1)
obd.each {|bd| @obk[bd] = 1 }
@obk[other_booking_days.last] += -2

all range is initialized to 0
first and last position in the range act like incremental counters..
in between just get a value