Another Chris Pine Tutorial Question

Let's write a program which asks us to type in as many words as we
want (one word per line, continuing until we just press Enter on an
empty line), and which then repeats the words back to us in
alphabetical order. OK?

So... first we'll—uh... um... hmmm... Well, we could—er... um...

You know, I don't think we can do it. We need a way to store an
unknown amount of words, and how to keep track of them all together,
so they don't get mixed up with other variables. We need to put them
in some sort of a list. We need arrays.
puts "Let's make a shopping list!"

shoplist = []

while shoplist.last != ''

shoplist.push(gets.downcase.chomp)

end

shoplist.pop

puts shoplist.sort

The program asks for one word per line but there is no way one can do
that utilizing the methods the tutorial has expounded upon up to this
point so I settled for what I got here.

However, it asks you to then do this:

• Try writing the above program without using the sort method. A large
part of programming is solving problems, so get all the practice you
can!

Could somebody point me in the right direction, or give me an example
of how that would be possible? I'm racking my brain but I can not
think of a way to do it without using methods and tools that you are
not yet supposed to use at this point in the tutorial (i.e. regex)

Have you already been introduced to String#<=> [
http://ruby-doc.org/core/classes/String.html#M000778 ] ? You could use it as
the basis for comparing each of the input strings to all others that you've
collected so far. How's that for a push in one direction?

Regards,
Craig

danielj wrote:

Let's write a program which asks us to type in as many words as we
want (one word per line, continuing until we just press Enter on an
empty line), and which then repeats the words back to us in
alphabetical order. OK?

So... first we'll—uh... um... hmmm... Well, we could—er... um...

You know, I don't think we can do it. We need a way to store an
unknown amount of words, and how to keep track of them all together,
so they don't get mixed up with other variables. We need to put them
in some sort of a list. We need arrays.
puts "Let's make a shopping list!"

shoplist =

while shoplist.last != ''

shoplist.push(gets.downcase.chomp)

end

shoplist.pop

puts shoplist.sort

The program asks for one word per line but there is no way one can do
that utilizing the methods the tutorial has expounded upon up to this
point so I settled for what I got here.

However, it asks you to then do this:

• Try writing the above program without using the sort method. A large
part of programming is solving problems, so get all the practice you
can!

Could somebody point me in the right direction, or give me an example
of how that would be possible? I'm racking my brain but I can not
think of a way to do it without using methods and tools that you are
not yet supposed to use at this point in the tutorial (i.e. regex)

There's not really any point to limiting yourself. Whatever you come up with will essentially be a crude or simplified sorting algorithm. If you really didn't want to use the sort method, you could do something like this:

words =
while true
   word = gets.chomp
   break if word == ''
   words << word
end

while words.size > 0
   word = words.min{|a,b| a.downcase <=> b.downcase }
   puts word
   words -= [word]
end

However, what you've ended up doing is creating something a lot like a selection sort only instead of swapping with the front of the list you're printing it and removing it from the list. In effect, it's just a really inefficient version of sort.

Maybe you've taken this as a personal challenge, but I've come to except some (most?) texts have at least some little quirks like this. They're best ignored while you move on to more interesting things. If you want a challenge, there's a huge backlog of RubyQuiz problems that are much more interesting.

···

--
Michael Morin
Guide to Ruby

Become an About.com Guide: beaguide.about.com
About.com is part of the New York Times Company

The trick I assume Chris is targeting at is to insert words at the correct position. That way your list is always sorted and you do not need an explicit sort operation.

Kind regards

  robert

···

On 30.08.2008 22:55, danielj wrote:

However, it asks you to then do this:

• Try writing the above program without using the sort method. A large
part of programming is solving problems, so get all the practice you
can!

Could somebody point me in the right direction, or give me an example
of how that would be possible? I'm racking my brain but I can not
think of a way to do it without using methods and tools that you are
not yet supposed to use at this point in the tutorial (i.e. regex)

words =
loop do #loop allows one to do an indefinite amount
of something--must set an exit
                          #inside of the loop.
incoming = gets
if incoming == "\n" then #if a blank line is entered, we are done.
Sort and puts the list.
  puts words.sort
  exit
else
  words << incoming #if data is entered, add it to the array of
words.
end
end

#=>
alphabet soup
bananas
coca cola
hot dogs
kool aid
lettuce
milk
potatoes
spinach
sugar

Tim Rand

···

On Aug 30, 1:55 pm, danielj <sleepingind...@gmail.com> wrote:

Let's write a program which asks us to type in as many words as we
want (one word per line, continuing until we just press Enter on an
empty line), and which then repeats the words back to us in
alphabetical order. OK?

So... first we'll—uh... um... hmmm... Well, we could—er... um...

You know, I don't think we can do it. We need a way to store an
unknown amount of words, and how to keep track of them all together,
so they don't get mixed up with other variables. We need to put them
in some sort of a list. We need arrays.
puts "Let's make a shopping list!"

shoplist =

while shoplist.last != ''

shoplist.push(gets.downcase.chomp)

end

shoplist.pop

puts shoplist.sort

The program asks for one word per line but there is no way one can do
that utilizing the methods the tutorial has expounded upon up to this
point so I settled for what I got here.

However, it asks you to then do this:

• Try writing the above program without using the sort method. A large
part of programming is solving problems, so get all the practice you
can!

Could somebody point me in the right direction, or give me an example
of how that would be possible? I'm racking my brain but I can not
think of a way to do it without using methods and tools that you are
not yet supposed to use at this point in the tutorial (i.e. regex)

That's a good idea. Or I suppose you could implement your own sorting method and call that instead.

···

On 2008-08-31 13:00:33 +0100, Robert Klemme <shortcutter@googlemail.com> said:

The trick I assume Chris is targeting at is to insert words at the correct position. That way your list is always sorted and you do not need an explicit sort operation.

> Let's write a program which asks us to type in as many words as we
> want (one word per line, continuing until we just press Enter on an
> empty line), and which then repeats the words back to us in
> alphabetical order. OK?

> So... first we'll—uh... um... hmmm... Well, we could—er... um...

> You know, I don't think we can do it. We need a way to store an
> unknown amount of words, and how to keep track of them all together,
> so they don't get mixed up with other variables. We need to put them
> in some sort of a list. We need arrays.
> puts "Let's make a shopping list!"

> shoplist =

> while shoplist.last != ''

> shoplist.push(gets.downcase.chomp)

> end

> shoplist.pop

> puts shoplist.sort

> The program asks for one word per line but there is no way one can do
> that utilizing the methods the tutorial has expounded upon up to this
> point so I settled for what I got here.

> However, it asks you to then do this:

> • Try writing the above program without using the sort method. A large
> part of programming is solving problems, so get all the practice you
> can!

> Could somebody point me in the right direction, or give me an example
> of how that would be possible? I'm racking my brain but I can not
> think of a way to do it without using methods and tools that you are
> not yet supposed to use at this point in the tutorial (i.e. regex)

SORRY. AFTER FIXING THE COMMENTS TO BE MORE READABLE--

···

On Aug 31, 11:21 pm, timr <timra...@gmail.com> wrote:

On Aug 30, 1:55 pm, danielj <sleepingind...@gmail.com> wrote:

words =
loop do #loop allows one to do an indefinite amount
                          #of something--must set an exit
#inside of the loop.
incoming = gets
if incoming == "\n" then #if a blank line is entered, we are done.
                          #Sort and puts the list.
puts words.sort
exit
else
words << incoming #if data is entered, add it to the array of
words.
end
end

#=>
alphabet soup
bananas
coca cola
hot dogs
kool aid
lettuce
milk
potatoes
spinach
sugar

Tim Rand

words = []
loop do #loop allows one to do an indefinite amount
                          # of something--must set an exit
                          #inside of the loop.
incoming = gets
if incoming == "\n" then #if a blank line is entered, we are done.
                          #Sort and puts the list.
  puts words.sort
  exit
else
  words << incoming #if data is entered, add it to the array of
words.
end
end

#=>
alphabet soup
bananas
coca cola
hot dogs
kool aid
lettuce
milk
potatoes
spinach
sugar

Tim Rand