# create a variable number of loop

Discussion in 'Ruby' started by Li Chen, Jul 21, 2009.

1. ### Li ChenGuest

Hi all,

I want to create a variable number of loop based on the input:
if the input is 1, I will create a loop ( I call it 1-loop);
if the input is 2 , I will create a nested loop( 2-loop);
if the input is 3, I will create a loop of loop of loop (3-loop);
if the input is 4, I will create a 4-loop, so on and so on.
How I can do that?

Thanks,

Li

array=%W{A B C D}

#input is 1

array.each do |e1|
puts e1
end

#input is 2
array.each do |e1|
array.each do |e|2
puts e1+e2
end
end

#input is 4
array.each do |e1|
array.each do |e2|
array.each do |e3|
array.each do |e4|
puts e1+e2+e3+e4
end
end
end
end
--
Posted via http://www.ruby-forum.com/.

Li Chen, Jul 21, 2009

2. ### James CoglanGuest

[Note: parts of this message were removed to make it a legal post.]

2009/7/21 Li Chen <>

> Hi all,
>
> I want to create a variable number of loop based on the input:
> if the input is 1, I will create a loop ( I call it 1-loop);
> if the input is 2 , I will create a nested loop( 2-loop);
> if the input is 3, I will create a loop of loop of loop (3-loop);
> if the input is 4, I will create a 4-loop, so on and so on.
> How I can do that?

Would this input be the size of the array you're looping over? Seems from
your example that you're trying to sum all the combinations of values in the
array. If so there's probably a clean recursive way to do this.

--
James Coglan
http://jcoglan.com

James Coglan, Jul 21, 2009

3. ### James CoglanGuest

[Note: parts of this message were removed to make it a legal post.]

2009/7/21 Li Chen <>

> Hi all,
>
> I want to create a variable number of loop based on the input:
> if the input is 1, I will create a loop ( I call it 1-loop);
> if the input is 2 , I will create a nested loop( 2-loop);
> if the input is 3, I will create a loop of loop of loop (3-loop);
> if the input is 4, I will create a 4-loop, so on and so on.
> How I can do that?
>
> Thanks,
>
> Li
>
> array=%W{A B C D}
>
> #input is 1
>
> array.each do |e1|
> puts e1
> end
>
>
> #input is 2
> array.each do |e1|
> array.each do |e|2
> puts e1+e2
> end
> end
>
> #input is 4
> array.each do |e1|
> array.each do |e2|
> array.each do |e3|
> array.each do |e4|
> puts e1+e2+e3+e4
> end
> end
> end
> end

You can do this recursively by decrementing a depth count until you hit the
bottom, at which point to print the data you want:

def print_sums(array, depth, memo = 0)
array.each do |x|
if depth == 1
puts memo + x
else
print_sums(array, depth - 1, memo + x)
end
end
end

data = %W{A B C D}
print_sums(data, 1)
print_sums(data, 2)
print_sums(data, 3)
print_sums(data, 4)

--
James Coglan
http://jcoglan.com

James Coglan, Jul 21, 2009
4. ### Li ChenGuest

> You can do this recursively by decrementing a depth count until you hit
> the
> bottom, at which point to print the data you want:

Hi James,

Thank you very much for the codes. It solves part of my problem. I try
implement the reamining part. But I don't think I can. Here is the
whole story:

What I really try to do is to create a word of using letters of
'A,B,C,D'' only with different size
(1-letter, 2-letter,3-letter, ..., up to 25-letter word).
For each word created I count the value for each individual letter and
get the sum for the word.

And here are the rules:
A=0; B=1;C=2;D=3
for a word of 1 letter its value is:

'A'=>0; 'B'=>1;''C'=>2; ''D'=>3;

for 'A', it has 0*(4**0) if it appears on 0th, 0*(4**1) if on 10th,
0*(4**2) if on 100th, so on and so on
for 'B', it has 1*(4**0) if it appears on 0th, 1*(4**1) if on 10th,
1*(4**2) if on 100th, so on and so on
similar to 'C' and 'D'

so the following word of 'ABCD' has a value: 0*(4**3)+ 1*(4**2)+
2**(4**1)+3*(4**0)
'DDDD' has a value:3*(4**3)+ 3*(4**2)+ 3**(4**1)+3*(4**0)

Li
--
Posted via http://www.ruby-forum.com/.

Li Chen, Jul 21, 2009
5. ### steveGuest

Li Chen wrote:
>> You can do this recursively by decrementing a depth count until you hit
>> the
>> bottom, at which point to print the data you want:

>
> Hi James,
>
> Thank you very much for the codes. It solves part of my problem. I try
> implement the reamining part. But I don't think I can. Here is the
> whole story:
>
> What I really try to do is to create a word of using letters of
> 'A,B,C,D'' only with different size
> (1-letter, 2-letter,3-letter, ..., up to 25-letter word).
> For each word created I count the value for each individual letter and
> get the sum for the word.
>
> And here are the rules:
> A=0; B=1;C=2;D=3
> for a word of 1 letter its value is:
>
> 'A'=>0; 'B'=>1;''C'=>2; ''D'=>3;
>
> for 'A', it has 0*(4**0) if it appears on 0th, 0*(4**1) if on 10th,
> 0*(4**2) if on 100th, so on and so on
> for 'B', it has 1*(4**0) if it appears on 0th, 1*(4**1) if on 10th,
> 1*(4**2) if on 100th, so on and so on
> similar to 'C' and 'D'
>
> so the following word of 'ABCD' has a value: 0*(4**3)+ 1*(4**2)+
> 2**(4**1)+3*(4**0)
> 'DDDD' has a value:3*(4**3)+ 3*(4**2)+ 3**(4**1)+3*(4**0)
>
>
> Li

irb(main):001:0> "DDDD".tr("DCBA","3210").to_i(4)
=> 255
irb(main):002:0>

steve, Jul 22, 2009
6. ### Li ChenGuest

steve wrote:
> Li Chen wrote:
>>
>> 'A'=>0; 'B'=>1;''C'=>2; ''D'=>3;
>>
>>
>> Li

>
> C:\Documents and Settings\Administrator>irb
> irb(main):001:0> "DDDD".tr("DCBA","3210").to_i(4)
> => 255
> irb(main):002:0>

Steve,

Thank you so much. It is so neat!

Li
--
Posted via http://www.ruby-forum.com/.

Li Chen, Jul 22, 2009