W
whisperjim
I'm working through the following tutorial http://pine.fm/LearnToProgram/
(recommended by the official Ruby site)
as a starting point and I've got to chapter 7 and struggling with the
following assignment........
" 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? "
Now I'm supposed to do this without any .sort method and the chapters
I've covered so far (1 ~ 7) have not covered method creation,
Classes,Blocks or Procs, so the challenge is to solve the assignment
without using them.
Now I've written a program but I think the basic 'mental model' is
flawed, I say this because of the results I'm getting.
If I use the following input [ q w e r t y ] I end up with [ e q r t w
w ] and the input [ z x c v b ] end up as [ b b b b b ].
If my mental model is o.k, then my code must be wrong, but I'm stumped
at to where.
# concept - store words in 1st array (words_array). Find the
'smallest' word alphabetically by selecting the last word (call it
wordCheck) and compare with the first word, second word and so on.....
and exchange the value of wordCheck with the other word (1st/2nd...
word) if the other word value happens to be less. Start the checking
again with the first word, second word.... and so on until a counter
has been reached (counter equal to current length of first unsorted
array). Once the counter has been reached, put the value of wordCheck
into a second array (sortedWords_array) and delete wordCheck value
from first unsorted array (words_array) and repeat until words_array
is empty.
puts 'Type in as many words as you want and once you\'ve had enough,
just \'enter\' a clear line.'
words_array = [] # create 1st array called words_array to store users
unsorted values
loop do
input = gets.downcase.chomp # take the user input, remove the
'enter' off the tail and lower the case and call ...
break if input.empty? # .. it 'input' , break from the loop if
'input' is equal to empty
words_array << input # push 'input' to the words_array
end
wordCheck = words_array.last # wordCheck is equal to the last 'input'
stored in the words_array
rotateCounter = 0
sortedWords_array = [] # create 2nd array to contain 'sorted' values
until words_array.length == 0 # exit once no words left in the first
unsorted array
while rotateCounter <= words_array.length # exit if rotate counter
greater than words contained within first array
if words_array[0] >= wordCheck # continue if first word in 1st array
greater or equal to wordCheck value
words_array.push words_array.shift # rotate the first unsorted
array
rotateCounter = rotateCounter + 1 # add 1 to counter
else wordCheck = words_array[0] # replace current value (wordCheck)
with 'smaller' word
rotateCounter = 0 # reset counter to zero
end
end
sortedWords_array.push wordCheck # add wordCheck value to 2nd array
until wordCheck = words_array.last # rotate first array until a
matching ..
words_array.push words_array.shift # .. value found at the back of
the first array
end
words_array.pop # remove the last value contained within the 1st
array
rotateCounter = 0 # reset rotate counter
wordCheck = words_array.last # replace current value of wordCheck
with new last word from 1st array
end
puts sortedWords_array # print values within 2nd array, which should
be in low to high alphabetical order
Guidance greatly appreciated.
(recommended by the official Ruby site)
as a starting point and I've got to chapter 7 and struggling with the
following assignment........
" 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? "
Now I'm supposed to do this without any .sort method and the chapters
I've covered so far (1 ~ 7) have not covered method creation,
Classes,Blocks or Procs, so the challenge is to solve the assignment
without using them.
Now I've written a program but I think the basic 'mental model' is
flawed, I say this because of the results I'm getting.
If I use the following input [ q w e r t y ] I end up with [ e q r t w
w ] and the input [ z x c v b ] end up as [ b b b b b ].
If my mental model is o.k, then my code must be wrong, but I'm stumped
at to where.
# concept - store words in 1st array (words_array). Find the
'smallest' word alphabetically by selecting the last word (call it
wordCheck) and compare with the first word, second word and so on.....
and exchange the value of wordCheck with the other word (1st/2nd...
word) if the other word value happens to be less. Start the checking
again with the first word, second word.... and so on until a counter
has been reached (counter equal to current length of first unsorted
array). Once the counter has been reached, put the value of wordCheck
into a second array (sortedWords_array) and delete wordCheck value
from first unsorted array (words_array) and repeat until words_array
is empty.
puts 'Type in as many words as you want and once you\'ve had enough,
just \'enter\' a clear line.'
words_array = [] # create 1st array called words_array to store users
unsorted values
loop do
input = gets.downcase.chomp # take the user input, remove the
'enter' off the tail and lower the case and call ...
break if input.empty? # .. it 'input' , break from the loop if
'input' is equal to empty
words_array << input # push 'input' to the words_array
end
wordCheck = words_array.last # wordCheck is equal to the last 'input'
stored in the words_array
rotateCounter = 0
sortedWords_array = [] # create 2nd array to contain 'sorted' values
until words_array.length == 0 # exit once no words left in the first
unsorted array
while rotateCounter <= words_array.length # exit if rotate counter
greater than words contained within first array
if words_array[0] >= wordCheck # continue if first word in 1st array
greater or equal to wordCheck value
words_array.push words_array.shift # rotate the first unsorted
array
rotateCounter = rotateCounter + 1 # add 1 to counter
else wordCheck = words_array[0] # replace current value (wordCheck)
with 'smaller' word
rotateCounter = 0 # reset counter to zero
end
end
sortedWords_array.push wordCheck # add wordCheck value to 2nd array
until wordCheck = words_array.last # rotate first array until a
matching ..
words_array.push words_array.shift # .. value found at the back of
the first array
end
words_array.pop # remove the last value contained within the 1st
array
rotateCounter = 0 # reset rotate counter
wordCheck = words_array.last # replace current value of wordCheck
with new last word from 1st array
end
puts sortedWords_array # print values within 2nd array, which should
be in low to high alphabetical order
Guidance greatly appreciated.