diff --git a/73_Reverse/ruby/reverse.rb b/73_Reverse/ruby/reverse.rb new file mode 100644 index 00000000..0e2f7934 --- /dev/null +++ b/73_Reverse/ruby/reverse.rb @@ -0,0 +1,111 @@ +ARRAYSIZE = 9 +$digitArray = Array.new(ARRAYSIZE) +$winningArray = Array.new(ARRAYSIZE) + +# Method to print the rules +def displayTheRules + puts "This is the game of 'Reverse'. to win, all you have" + puts "to do is arrange a list of numbers (1 through " + ARRAYSIZE.to_s + ")" + puts "in numerical order from left to right. to move, you" + puts "tell me how many numbers (counting from the left) to" + puts "reverse. For example, if the current list is:" + puts "2 3 4 5 1 6 7 8 9" + puts "and you reverse 4, the result will be:" + puts "5 4 3 2 1 6 7 8 9" + puts "Now if you reverse 5, you win!" + puts "1 2 3 4 5 6 7 8 9" + puts "No doubt you will like this game, but" + puts "if you want to quit, reverse 0 (zero)." +end + +# Method to print the list +def printList + puts "\n" + $digitArray.join(" ") + "\n\n" +end + +# Zero-based arrays contain digits 1-9 +# Make a random array and an ordered winning answer array A[0] to A[N] +def makeRandomList + for kIndex in 0..ARRAYSIZE-1 do + $digitArray[kIndex] = kIndex+1 + $winningArray[kIndex] = kIndex+1 + end + # now randomize the digit array order + $digitArray.shuffle! +end + +def checkForWin? (triesSoFar) + # Check for a win (all array elements in order) + if $digitArray == $winningArray then + puts "You won it in " + triesSoFar.to_s + " moves!!!\n\n" + puts "try again (yes or no)?" + tryAgain = gets.strip.upcase + if tryAgain == "YES" then + return true + end + puts "\nO.K. Hope you had fun!!" + exit + end + return false +end + +def reverseIt (howManyToReverse, triesSoFar) + # REVERSE R NUMBERS AND PRINT NEW LIST + + # extract and reverse the first howManyToReverse elements of the array + subArray = $digitArray.take(howManyToReverse) + subArray.reverse! + + # get the remaining elements of the original array + endArray = $digitArray.slice(howManyToReverse, ARRAYSIZE) + # append those elements to the reversed elements + $digitArray = subArray.concat(endArray) + + # if we got all in order, randomize again + isWinner = checkForWin?(triesSoFar) + if isWinner == true then + makeRandomList + end + printList # always print the newly ordered list + return isWinner +end + +def askHowManyToReverse + puts "How many shall I reverse?"; + rNumber = gets.to_i + if rNumber > 0 then + if rNumber > ARRAYSIZE then + puts "Oops! Too many! I can reverse at most " + ARRAYSIZE.to_s + end + else + rNumber = 0 # zero or negative values end the game + end + return rNumber +end + +puts "REVERSE" +puts "Creative Computing Morristown, New Jersey\n\n\n" +puts "REVERSE -- A game of skill\n\n" + +puts "Do you want the rules?" +wantRules = gets.strip.upcase +if wantRules == "YES" then + displayTheRules +end + +makeRandomList +howManyTries = 0 +puts "\nHere we go ... the list is:" +printList # display the initial list +# start the game loop +r = askHowManyToReverse +while r != 0 do # zero will end the game + if r <= ARRAYSIZE then + howManyTries = howManyTries+1 + if reverseIt(r, howManyTries) then + howManyTries = 0 + end + end + r = askHowManyToReverse +end +