create a variable number of loop

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

  1. Li Chen

    Li Chen Guest

    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
    #1
    1. Advertising

  2. Li Chen

    James Coglan Guest

    [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
    #2
    1. Advertising

  3. Li Chen

    James Coglan Guest

    [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
    #3
  4. Li Chen

    Li Chen Guest

    > 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
    to follow your idea and
    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
    #4
  5. Li Chen

    steve Guest

    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
    > to follow your idea and
    > 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


    C:\Documents and Settings\Administrator>irb
    irb(main):001:0> "DDDD".tr("DCBA","3210").to_i(4)
    => 255
    irb(main):002:0>
    steve, Jul 22, 2009
    #5
  6. Li Chen

    Li Chen Guest

    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
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Brian
    Replies:
    3
    Views:
    422
    Siemel Naran
    Apr 19, 2004
  2. KingdomHeart
    Replies:
    0
    Views:
    431
    KingdomHeart
    Jan 23, 2009
  3. Erik the Red
    Replies:
    4
    Views:
    173
    Chris Pine
    Jul 29, 2005
  4. Mike P
    Replies:
    27
    Views:
    284
    Mike P
    Nov 6, 2005
  5. Isaac Won
    Replies:
    9
    Views:
    372
    Ulrich Eckhardt
    Mar 4, 2013
Loading...

Share This Page