Beginner's question

Discussion in 'Ruby' started by Peter Johnsson, Mar 24, 2008.

  1. This question may be a bit too "simple" for this forum which seems to
    target intermediate and advanced users, but if that's the case someone
    could perhaps direct me to a place which is better for asking this
    question?

    I have just recently decided to try and learn programming (namely
    Ruby), and in order to do so I've been using a tutorial called "learn to
    program" (http://pine.fm/LearnToProgram/).
    Everything has gone just fine until I reached the 6:th chapter (Flow
    Control) in which the author teaches about among other things branching
    and loop-methods.
    I think I understand most of it, however, I'm having very large
    difficulties with the " A Few Things to Try" part of the chapter.
    I find the "99 beer bottles"-program utterly impossible to do. I
    realise that I should somehow use the methods listed on the page, but I
    just can seem to know how. My initial idea is to create a variable
    called "bottles" which at first is 99 and then subtract 1 in every new
    verse until the variable hits 0, where I was thinking I could use the
    "while"-method to end the program. Each new value would be inserted into
    the lyrics. It would look something like this I suppose (please don't
    laugh, I know it doesn't really do anything at all).

    bottles = 99

    while bottles != 0
    # Need help here.
    end

    I stumbled upon a site which showed how one scould program this in Ruby
    (http://99-bottles-of-beer.net/language-ruby-1272.html), but the problem
    is it doesn't use the same methods. It's more advanced since it creates
    classes and defines methods, something which I think lies a bit too far
    ahead for me, and I somehow want to learn things in "the right order".

    I'm thankful for any tips as well as code-examples. Thank you very much.
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Johnsson, Mar 24, 2008
    #1
    1. Advertising

  2. Peter Johnsson

    James Gray Guest

    On Mar 24, 2008, at 9:05 AM, Peter Johnsson wrote:

    > This question may be a bit too "simple" for this forum which seems to
    > target intermediate and advanced users, but if that's the case someone
    > could perhaps direct me to a place which is better for asking this
    > question?


    We welcome all questions.

    > bottles = 99
    >
    > while bottles != 0
    > # Need help here.
    > end


    You are doing just fine here. Great start.

    The most important thing is to try to move in very small steps. Try
    to add just one more little thing to your code, then another thing,
    and another. Each time moving closer to what you really want. That's
    how programmers manage the complexity of tackling big problems we
    can't keep all in our head at one time.

    So, for a next step, can you just getting it printing the song lyrics
    inside the loop? They don't need to reflect the decreasing bottle
    count yet, just get it printing something 99 times. Of course, to do
    that, you will need to reduce the bottle variable each time so it
    eventually hits zero and cancels the loop. Given that, you need to
    add one or more puts() statements to handle the printing and a line
    that does some math on the bottles variable.

    Is that enough of a hint? If not, come back and I'll show you some
    code.

    Good luck and welcome to Ruby!

    James Edward Gray II
     
    James Gray, Mar 24, 2008
    #2
    1. Advertising

  3. Peter Johnsson wrote:
    > This question may be a bit too "simple" for this forum which seems to
    > target intermediate and advanced users, but if that's the case someone
    > could perhaps direct me to a place which is better for asking this
    > question?
    >
    > I have just recently decided to try and learn programming (namely
    > Ruby), and in order to do so I've been using a tutorial called "learn to
    > program" (http://pine.fm/LearnToProgram/).
    > Everything has gone just fine until I reached the 6:th chapter (Flow
    > Control) in which the author teaches about among other things branching
    > and loop-methods.
    > I think I understand most of it, however, I'm having very large
    > difficulties with the " A Few Things to Try" part of the chapter.
    > I find the "99 beer bottles"-program utterly impossible to do. I
    > realise that I should somehow use the methods listed on the page, but I
    > just can seem to know how. My initial idea is to create a variable
    > called "bottles" which at first is 99 and then subtract 1 in every new
    > verse until the variable hits 0, where I was thinking I could use the
    > "while"-method to end the program. Each new value would be inserted into
    > the lyrics. It would look something like this I suppose (please don't
    > laugh, I know it doesn't really do anything at all).
    >
    > bottles = 99
    >
    > while bottles != 0
    > # Need help here.
    > end
    >
    > I stumbled upon a site which showed how one scould program this in Ruby
    > (http://99-bottles-of-beer.net/language-ruby-1272.html), but the problem
    > is it doesn't use the same methods. It's more advanced since it creates
    > classes and defines methods, something which I think lies a bit too far
    > ahead for me, and I somehow want to learn things in "the right order".
    >
    > I'm thankful for any tips as well as code-examples. Thank you very much.


    When doing a loop of this type, concentrate on what is static and what
    needs to change at each iteration. In each verse the only thing that
    changes are the numbers so:

    while bottles > 0
    after_this_loop = bottles-1
    puts "#{bottles} of beer on the wall. #{bottles} of beer. Take one
    down and pass it around #{bottles=bottles-1} bottles of beer on the
    wall"
    bottles = bottles -1
    end

    A ruby programmer would probably do something like:

    99.downto(1) do |bottles|
    puts "#{bottles} of beer on the wall. #{bottles} of beer. Take one down
    and pass it around #{bottles=bottles-1} bottles of beer on the wall"
    end

    Now, figure out how to make the verse come out right when bottles = 1
    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Patterson, Mar 24, 2008
    #3
  4. whoops, cut and paste error

    the first loop should be
    while bottles > 0
    after_this_loop = bottles-1
    puts "#{bottles} of beer on the wall. #{bottles} of beer. Take one
    down and pass it around #{bottles-1} bottles of beer on the wall"
    bottles = bottles -1
    > end

    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Patterson, Mar 24, 2008
    #4
  5. Peter Johnsson

    James Gray Guest

    On Mar 24, 2008, at 9:34 AM, Jeff Patterson wrote:

    > puts "#{bottles} of beer on the wall. #{bottles} of beer. Take one
    > down and pass it around #{bottles=3Dbottles-1} bottles of beer on the
    > wall"


    Learn to Program doesn't show this kind of interpolation, if my memory =20=

    serves, so Peter is probably more use to seeing this as:

    puts bottles.to_s + ' of beer on the wall=85'

    James Edward Gray II=
     
    James Gray, Mar 24, 2008
    #5
  6. Peter Johnsson wrote:
    > bottles = 99
    >
    > while bottles != 0
    > # Need help here.
    > end


    My $0.02:

    bottles = 99
    bob = " bottles of beer "
    otw = "on the wall."

    while bottles != 0 do
    puts bottles.to_s + bob + otw
    puts bottles.to_s + bob
    puts "Take one down and pass it around"
    bottles -= 1
    puts bottles.to_s + bob + otw
    puts ""
    end

    Here is a way to do it with an implicit decrementor:

    bob = " bottles of beer "
    otw = "on the wall."

    99.downto(1) do |bottles|
    puts bottles.to_s + bob + otw
    puts bottles.to_s + bob
    puts "Take one down and pass it around"
    puts (bottles - 1).to_s + bob + otw
    puts ""
    end
    --
    Posted via http://www.ruby-forum.com/.
     
    Lloyd Linklater, Mar 24, 2008
    #6
  7. On Monday 24 March 2008, Peter Johnsson wrote:
    > This question may be a bit too "simple" for this forum which seems to
    > target intermediate and advanced users, but if that's the case someone
    > could perhaps direct me to a place which is better for asking this
    > question?
    >
    > I have just recently decided to try and learn programming (namely
    > Ruby), and in order to do so I've been using a tutorial called "learn to
    > program" (http://pine.fm/LearnToProgram/).
    > Everything has gone just fine until I reached the 6:th chapter (Flow
    > Control) in which the author teaches about among other things branching
    > and loop-methods.
    > I think I understand most of it, however, I'm having very large
    > difficulties with the " A Few Things to Try" part of the chapter.
    > I find the "99 beer bottles"-program utterly impossible to do. I
    > realise that I should somehow use the methods listed on the page, but I
    > just can seem to know how. My initial idea is to create a variable
    > called "bottles" which at first is 99 and then subtract 1 in every new
    > verse until the variable hits 0, where I was thinking I could use the
    > "while"-method to end the program. Each new value would be inserted into
    > the lyrics. It would look something like this I suppose (please don't
    > laugh, I know it doesn't really do anything at all).
    >
    > bottles = 99
    >
    > while bottles != 0
    > # Need help here.
    > end
    >
    > I stumbled upon a site which showed how one scould program this in Ruby
    > (http://99-bottles-of-beer.net/language-ruby-1272.html), but the problem
    > is it doesn't use the same methods. It's more advanced since it creates
    > classes and defines methods, something which I think lies a bit too far
    > ahead for me, and I somehow want to learn things in "the right order".
    >
    > I'm thankful for any tips as well as code-examples. Thank you very much.


    Inside the while loop, you need to do essentially three things:
    a) display the verse related to the current number of bottles
    b) break a bottle (that is, decrease the variable bottle by one)
    c) display the verse related to the new number of bottles

    Each of these goals may be translated in a line of code:

    while bottles !=0
    puts bottles.to_s + "bottles of beer on the wall, " + bottles.to_s + "bottles of beer."
    bottles -= 1
    puts "Take one down and pass it around, "+ bottles.to_s + "bottles of beer on the wall."
    end

    This works almost perfectly, except for the fact that it doesn't treat the
    case of one bottle and of 0 bottle in a special way (when there's only one
    bottle, it should print 1 bottle, when there are no more bottles, it should
    write so). To correct this, you should insert some if statements inside the
    while loop.

    I hope this helps

    Stefano
     
    Stefano Crocco, Mar 24, 2008
    #7
  8. I just have to add one that has another hopefully helpful bit in it.

    def printFromMethod(i, s)
    puts "#{i} bottles of beer" + s
    end

    99.downto(1) do |bottles|
    printFromMethod(bottles, " on the wall.")
    printFromMethod(bottles, ".")
    puts "Take one down and pass it around."
    printFromMethod(bottles - 1, " on the wall.")
    puts ""
    end
    --
    Posted via http://www.ruby-forum.com/.
     
    Lloyd Linklater, Mar 24, 2008
    #8
  9. Thank you for all of your responses. I'm sorry for being so slow with
    responding, but you guys have given me a lot of helpful information so
    I've been trying to focus on looking at your examples as well as
    understanding them. I'll keep reading and try to make sure I get it
    right at last. Thanks a lot, you've helped me very much!
    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Johnsson, Mar 24, 2008
    #9
  10. Peter Johnsson

    Todd Benson Guest

    On Mon, Mar 24, 2008 at 10:02 AM, Peter Johnsson <> wrote:
    > Thank you for all of your responses. I'm sorry for being so slow with
    > responding, but you guys have given me a lot of helpful information so
    > I've been trying to focus on looking at your examples as well as
    > understanding them. I'll keep reading and try to make sure I get it
    > right at last. Thanks a lot, you've helped me very much!


    Here's a weird one that won't help you that much. It's just for fun.
    You can separate 1, 0, and other integers with 1 / i. For example...

    [0, 1, 2, 3, 4, 5].reverse.map! {|i| ((1 / i).zero? ? "a" : "b" rescue "c")}

    => ["a", "a", "a", "a", "b", "c"]

    Why would you do it this way? Well, you probably wouldn't. You'd be
    just fine with if/then/elsif/else and case constructs, not to mention
    this strange use of "rescue" for a conditional predicate.

    To the OP, you definitely are on the right track! Just remember that
    Ruby has some behind-the-scenes methods that do this type of work for
    you.

    Todd
     
    Todd Benson, Mar 24, 2008
    #10
  11. Haha! finally. After a plentyful of hours I have at last finished a
    working code. Completely inept and lacking of grace, I know, but still!
    At last it is finished.
    Just thought I would let you guys know since you helped me so much by
    providing me with code-examples and tips. I know I've thanked you once
    already, but anyways once again, thanks!
    I also read some of the advanced coding, and even though I can't
    understand half of it I found it pleasureable to read. It also spurs me
    to work harder so that one day I can (hopefully) understand it.

    Here is the code by the way:

    --------------
    bottles = 99
    line1 = " bottles of beer on the wall, "
    line2 = " bottles of beer."
    line3 = "Take one down and pass it around, "
    line4 = "bottles of beer on the wall."

    while bottles != 0
    if bottles != 1
    firstpar = bottles.to_s + line1 + bottles.to_s + line2
    secpar = line3 + bottles.to_s + line4
    puts firstpar
    bottles -= 1
    puts secpar
    else
    line1["bottles"] = "bottle"
    line2["bottles"] = "bottle"
    line4["bottles"] = "no more bottles"
    firstpar = bottles.to_s + line1 + bottles.to_s + line2
    secpar = line3 + line4
    puts firstpar
    bottles -= 1
    puts secpar
    end
    end

    line1 = " bottles of beer on the wall, "
    line2 = " bottles of beer."
    firstpar = "No more " + line1 + "no more " + line2
    secpar = "Go to the store and buy some more, 99 bottles of beer on the
    wall."
    puts firstpar
    puts secpar
    -----

    I know it's not pretty, but in time I hope it will become more graceful.
    :D

    --
    Posted via http://www.ruby-forum.com/.
     
    Peter Johnsson, Mar 24, 2008
    #11
  12. Peter Johnsson

    Marc Heiler Guest

    > I also read some of the advanced coding, and even though I can't
    > understand half of it I found it pleasureable to read.


    Dont worry too much about understanding everything. If it is too
    complicated, then ask whether you even need it right now.
    In its core, ruby is short and very beautiful. My favourite rule of
    thumb is that the more you write (in ruby) the shorter and more elegant
    a solution gets (of course this is not always true, and complex problems
    will still be harder to solve elegantly and in a concise manner than
    simple problems, but you get the point)

    If one wants to be confused, one can listen to an explanation of a
    Haskell coder - what are Monads and more important why this is important
    to know. :>
    --
    Posted via http://www.ruby-forum.com/.
     
    Marc Heiler, Mar 24, 2008
    #12
  13. Good job. One thought though, as you are learning to program always keep
    in mind what is actually happening as your code is executed with an eye
    towards minimizing decision points, each of which which take time. For
    example, in your loop each time through two checks are made in a row:
    while bottles != 0
    if bottles != 1

    If instead you did:
    while bottles != 1
    non-special code goes here..
    bottles=bottles -1
    end

    # note bottles = 1 here
    #print out special case verse


    See how we've eliminated the unnecessary decision point? Such
    optimizations are especially important inside loops where the interior
    code gets executed over and over.

    Cheers
    Jeff
    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Patterson, Mar 24, 2008
    #13
  14. Peter Johnsson

    Tim Hunter Guest

    Peter Johnsson wrote:
    > Haha! finally. After a plentyful of hours I have at last finished a
    > working code. Completely inept and lacking of grace, I know, but still!
    > At last it is finished.


    Congratulations! I know how good this feeling is.

    I wrote my first program in 1979. It was a dozen lines of FORTRAN that
    computed the roots of a quadratic equation. I typed the code into a
    machine that produced punched cards, fed the cards into the hopper of a
    punch card reader, and then waited beside a line printer the size of a
    commericial washing machine. Some time between a few minutes and a few
    hours later the output appeared, printed on a giant sheet of continuous
    fold paper patterned with alternating light and dark green lines. I took
    the paper home with me and spent more time than I'd care to admit just
    looking at it.

    That was 29 years ago and I've never looked back. I hope the hours you
    spend programming are as rewarding as mine have been.
     
    Tim Hunter, Mar 25, 2008
    #14
  15. Peter Johnsson

    thufir Guest

    On Mon, 24 Mar 2008 23:23:16 +0900, James Gray wrote:


    > So, for a next step, can you just getting it printing the song lyrics
    > inside the loop? They don't need to reflect the decreasing bottle count
    > yet, just get it printing something 99 times. Of course, to do that,
    > you will need to reduce the bottle variable each time so it eventually
    > hits zero and cancels the loop. Given that, you need to add one or more
    > puts() statements to handle the printing and a line that does some math
    > on the bottles variable.



    In a sense, an infinite loop here, where it just prints:


    99 bottles of beer
    99 bottles of beer
    99 bottles of beer
    ...


    is ok because it gives you something to work *from*. You know that the
    loop is executing, you know that the print statements are working...

    then the question becomes: why doesn't the number decrease?

    While I haven't read the tutorial, I hope that this helps :)



    -Thufir
     
    thufir, Mar 28, 2008
    #15
    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. Jerker Hammarberg

    Beginner question: What trigs processes

    Jerker Hammarberg, Jul 17, 2003, in forum: VHDL
    Replies:
    16
    Views:
    1,654
    Mike Treseler
    Jul 22, 2003
  2. smu
    Replies:
    3
    Views:
    2,664
    shobhit24
    Jun 28, 2006
  3. =?Utf-8?B?S3VydCBTY2hyb2VkZXI=?=

    No Class at ALL!!! beginner/beginner question

    =?Utf-8?B?S3VydCBTY2hyb2VkZXI=?=, Feb 2, 2005, in forum: ASP .Net
    Replies:
    7
    Views:
    651
    =?Utf-8?B?S3VydCBTY2hyb2VkZXI=?=
    Feb 3, 2005
  4. Rensjuh
    Replies:
    7
    Views:
    1,039
    Mabden
    Sep 2, 2004
  5. william nelson

    Beginner's Beginner

    william nelson, Apr 11, 2011, in forum: Ruby
    Replies:
    7
    Views:
    259
    7stud --
    Apr 12, 2011
Loading...

Share This Page