Reading from the command line

Use the irb to try out the examples.

Don’t forget to type!

Writing to the console

print is similar to puts but it doesn’t add a new line to the end of the output.

print "x + y ="

Reading from the console

To read input from the console:

input = gets

To read input without the new line use chomp

input = gets.chomp

Ranges

A range is an interval with a beginning and an end.

To get the numbers between 1 until 5.

(1..5).to_a

To get all the numbers from 1 up to 5, excluding 5.

(1...5).to_a

to_a returns an array representation of an object. In the above case, it converts a range to an array

Random.rand()

Random is an interface to a number generator. The rand() method takes in an integer value max. It returns an integer greater than or equal to zero and less than max. You can also use a range as a parameter.

Random.rand(5..10)

Exercise 1: Numbers game!

In this exercise we’ll create a small game to help us practise maths.

First, create an empty file called numbers.rb.

To execute the file, run the following:

ruby numbers.rb

In this exercise we want to generate two random numbers x and y using Random.rand(). We will output the numbers to the console and read in the answer.

print "#{x} + #{y} = "

to_i returns an integer representation of an object.

if the answer is correct, output Right!. If the answer is incorrect, output Wrong :(.

Use an if .. else .. statement

Now we also want to limit the generated number to be between 1 and 10. To do that, we can pass in a range as a parameter to Random.rand().

Extending the game

Let’s add a loop, so that the game is repeated 10 times before it ends.

turns = 0

while turns < 10
turns = turns + 1

# game code
end

We can also store the number of correct and failed attempts so we can calculate the score of the game. We can do that by incrementing the value of a correct and wrong variables when we check if the answer is correct or not.

To calculate the percentage of correct answers we need to divide the correct answers with the total attempts and multiply the result by 100.

score = 100*...

Output the score after the loop

puts "Rights #{correct}; Wrongs #{wrong}; Score #{score}%"

Time!

To get the number of seconds that it takes to run the game we can store the timestamp at the beginning of the game and then subtract it at the end. To do that, we can use Time.now

Try outputting Time.now in the irb

First create and assign the time to a variable start. Then, subtract Time.now - start and output that.

puts "Total time #{duration} seconds"

You can also calculate the average time it take to respond to each problem by dividing the duration with the amount of attempts.

puts "#{duration/turns} seconds per problem"

Reading and writing to a file

In Ruby we can use the File object to read and write to files.

To open an existing file we use

File.open(filename, mode)

The mode indicates if the file will be opened for reading or writing.

Writing to a file

To write to a file, we must open it using the write mode (w), write the new content and close() it when we are done.

filename = "colors.txt"
file = File.open(filename, "w")
file.puts "red "
file.puts "green"
file.puts "blue"
file.close

Alternatively, we can use a block.

filename = "colors.txt"
File.open(filename, 'w') do |file|
file.write("red")
file.write("green")
file.write("blue")
end

Reading from a file

To read from a file, we first open it and then while there is more content, read each line.

File.open('animals.txt', 'r') do |file|
while line = file.gets
puts line
end
end

Download the animals.txt file used in the example.

Exercise 2: Storing scores

Now that we know how to store information, we can store and load the scores for our numbers game.

Extend the game to ask for the player’s name at the end of the game, and store the name and time each game has taken in the scores.txt file using comma separated values

player1, 12.24
player2, 8.32
player3, 9.12

Then display the five highest scores.

To get the highest scores you can read in each line and then use split(",") to turn it into an array.

while entry = file.gets
scores << entry.split(",")
end

You can then use the array sort method.

More practise

Download and try to go through as much of the Ruby Koans as you can.

After you download the repository, you can generate the koans using

rake gen

To regenerate and delete any progress you’ve already make run

rake regen

To try out the koans run rake. It gives you a hint as to what fails and you can move forward by fixing the file and running rake again.

If you are working through this at home you can ask for help in our slack channel.