Week 01 Weekly Exercises
Objectives
- to practice the basics of Rust
- to practice using Rust tools
- to practice rust intro and algebraic types
Activities To Be Completed
The following is a list of all the markedactivities available to complete this week...
- Mini-Grep
- Multiverse
- Carnival
- DALL-E-RS
- Picasso
- Dealing with IO
The following practice activities are optional and are not marked, or required to be completed for the week.
- 
                None - all exercises this week are marked.
              
Preparation
Before attempting the weekly exercises you should re-read the relevant lecture slides and their accompanying examples.
Getting Started
                Create a new directory for this week's exercises called
                lab01, change to this directory, and fetch the
                provided code for this week by running these commands:
              
mkdir lab01 cd lab01 6991 fetch lab 01
Or, if you're not working on CSE, you can download the provided code as a tar file.
                  
                    Exercise:
                  
                  
Mini-Grep
                
              
                You have been given a crate,
                mini_grep, which prints the first command-line
                argument.
              
                Your task is to modify mini_grep/src/main.rs, such
                that it reads lines on standard input, printing each line back
                out if and only if the input line contains the command-line
                argument.
              
For example,
cd mini_grep
6991 cargo run -- foo
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/mini_grep foo`
this line contains the text foo so it is printed
this line contains the text foo so it is printed
... but this line does not, so it is not printed
6991 cargo run -- hi
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/mini_grep foo`
the pattern can appear inside a larger word: chicken!
the pattern can appear inside a larger word: chicken!
6991 cargo run -- HI
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/mini_grep foo`
the pattern is case-sensitive: hi
Hi and hI don't work either
only HI will match this pattern
only HI will match this pattern
6991 cargo run -- 😂
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/mini_grep foo`
oh and; emojis should work too 😂😂😂
oh and; emojis should work too 😂😂😂
and they follow the same rules: 😃 🌍 🍞 🚗
              
              
                When you think your program is working, you can use
                autotest to run some simple automated tests:
              
6991 autotest
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
                  
                    Exercise:
                  
                  
Multiverse
                
              Across the broad range of the multiverse, there are an infinite number of universes! These universes however follow a pattern, allowing us to write code in order to output the details of a universe, given its id.
                You have been given a crate,
                multiverse, which does not compile!
              
                Your task is to modify the given structure,
                get_universe_details function and the noted areas
                of the main function, inside
                multiverse/src/main.rs, such that it loops through
                id's of 1-15, and prints out the universe details of the
                universe with that ID.
              
The universe lookup follows some basic rules:
- If the universe id is divisible by 3 - then that universe is the star wars universe, where the rebels won and the population is the max number that a u32 can fit!
- If the universe id is divisible by 5 - then it is the miraculous ladybug universe, where the villian Hawk Moth won, leaving the universe with a population of 22.
- Finally, if the universe id is divisible by both 5 and 3 - then it is the Stardew Valley universe, where the evil Jojo Corp won, leaving a population of only one!
Your program should match the following example
cd multiverse
6991 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/multiverse`
Universe with id 1 is unknown
Universe with id 2 is unknown
Universe with id 3 is called Star Wars, won by The Rebellion and has a population of 4294967295
Universe with id 4 is unknown
Universe with id 5 is called Miraculous, won by Hawk Moth and has a population of 22
Universe with id 6 is called Star Wars, won by The Rebellion and has a population of 4294967295
Universe with id 7 is unknown
Universe with id 8 is unknown
Universe with id 9 is called Star Wars, won by The Rebellion and has a population of 4294967295
Universe with id 10 is called Miraculous, won by Hawk Moth and has a population of 22
Universe with id 11 is unknown
Universe with id 12 is called Star Wars, won by The Rebellion and has a population of 4294967295
Universe with id 13 is unknown
Universe with id 14 is unknown
Universe with id 15 is called Stardew Valley, won by Jojo Corp and has a population of 1
              
              
              
                When you think your program is working, you can use
                autotest to run some simple automated tests:
              
6991 autotest
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
                  
                    Exercise:
                  
                  
Carnival
                
              Shrey and Tom are looking to go to the carnival! However, there is only one ticket 🥺
                You have been provided a crate,
                carnival. Your task is to modify the main function
                in carnival/src/main.rs, and the
                move_ticket function, to make them go to the
                carnival.
              
Specifically, you should
- Only change the main function from line 16 onwards
- Implement the move_ticketfunction
- Move the ticket that Shrey owns to Tom
- Not use any concepts not yet taught (namely, borrowing)
                This exercise aims to test your understanding of Rust's
                ownership system. Like most exercises, you can simply just print
                the right output, or do lots of .clone(), but this
                will not help you in future assignments or the final exam.
              
The output when completed, should look like:
cd carnival
6991 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/carnival`
SHREY ticket: None
TOM ticket: Some(Ticket)
              
              
                When you think your program is working, you can use
                autotest to run some simple automated tests:
              
6991 autotest
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
                  
                    Exercise:
                  
                  
DALL-E-RS
                
              In order to get started, you will need to create a Cargo project
                You can do this by running the cargo new command in
                your terminal
              
6991 cargo new dall-e-rs Created binary (application) `dall-e-rs` package
Your task is to create a simple Cargo project, in order to generate some art by outputting a 200 x 200 bmp image. This exercise enables you to practice using the cargo build system. It is manually marked, (practically any image that has some degree of effort will get full marks) and your submission will be uploaded to a course gallery later during week 2/3.
                You should now have a Cargo package inside the
                dall-e-rs directory.
              
cd dall-e-rs ls Cargo.toml src
                The cargo project starts you off with a
                Cargo.toml file, which describes the project.
              
cat Cargo.toml [package] name = "dall-e-rs" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies]
                The dependencies section of the Cargo.toml file
                describes the dependencies of the project.
              
                In this case we need to have a dependancy on the
                bmp crate (remember, a crate is what Rust calls an
                external library).
              
We can add this dependancy by running the following command:
6991 cargo add bmp
    Updating crates.io index
      Adding bmp v0.5.0 to dependencies.
              
                You can search for Rust libraries (we call them "crates") on the
                Rust community crate registry:
                https://crates.io/. To view the documentation for a particular crate, you can
                visit https://docs.rs/<crate>/, where
                <crate> is the name of the crate.
              
                For example, the documentation for the bmp crate
                can be found at
                https://docs.rs/bmp/.
              
                Cargo also creates a src directory, which contains
                the source code for the project. This directory starts with a
                main.rs file, which is the entry point for the
                project.
              
ls src
main.rs
cat src/main.rs
fn main() {
    println!("Hello, world!");
}
              You write your program in here!
To compile your project, you can run the following command:
6991 cargo build
    Updating crates.io index
   Compiling byteorder v1.4.3
   Compiling bmp v0.5.0
   Compiling dall-e-rs v0.1.0 (/tmp/tmp.CCQoWnQuRt/dall-e-rs)
    Finished dev [unoptimized + debuginfo] target(s) in 1.46s
              
                Your code will be compiled into an executable binary, located in
                the newly created target directory.
              
ls Cargo.lock Cargo.toml src target ls target CACHEDIR.TAG debug ls target/debug build deps examples incremental dall-e-rs dall-e-rs.d ./target/debug/dall-e-rs Hello, world!
                Instead of writing 6991 cargo build, followed by
                ./target/debug/dall-e-rs  each time you want to run
                your program, you can simply use the
                6991 cargo run command.
              
6991 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/dall-e-rs `
Hello, world!
              
                Now it is your turn! Think of a fun idea for a simple piece of
                art, and then write it in the src/main.rs file.
                Your code should generate a single file, which should have a
                .bmp extension.
              
                Don't forget to test your code along the way with the
                cargo run command.
              
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
                  
                    Exercise:
                  
                  
Picasso
                
              .bmp files) and output their
              representation to the terminal.
              
                Your program will only be given either valid BMP files,
                consisting of
                RED, LIME, BLUE and
                WHITE
                pixels, or a malformed file (including, for example, a filepath
                to a file that does not exist). These constants can be found in
                bmp::consts
                (i.e, the consts module of the bmp crate).
              
If your program is given a valid BMP file, it should output the following:
6991 cargo run -- path/to/shreys_art.bmp
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/picasso path/to/shreys_art.bmp`
===== ../../files.cp/shreys_art.bmp =====
R W W W W W W W W W W W W W B G W R W W R W W R W W R W W R 
W R W W W W W W W W W W W W B G R W W R W W R W W R W W R W 
W W R W W W W W W W W W W W B G W W R W W R W W R W W R W W 
W W W R W W W W W W W W W W B G W R W W R W W R W W R W W R 
W W W W R W W W W W W W W W B G R W W R W W R W W R W W R W 
W W W W W R W W W W W W W W B G W W R W W R W W R W W R W W 
W W W W W W R W W W W W W W B G W R W W R W W R W W R W W R 
W W W W W W W R W W W W W W B G R W W R W W R W W R W W R W 
W W W W W W W W R W W W W W B G W W R W W R W W R W W R W W 
W W W W W W W W W R W W W W B G W R W W R W W R W W R W W R 
W W W W W W W W W W R W W W B G R W W R W W R W W R W W R W 
W W W W W W W W W W W R W W B G W W R W W R W W R W W R W W 
W W W W W W W W W W W W R W B G W R W W R W W R W W R W W R 
W W W W W W W W W W W W W R B G R W W R W W R W W R W W R W 
G G G G G G G G G G G G G G B G B B B B B B B B B B B B B B 
B B B B B B B B B B B B B B G B G G G G G G G G G G G G G G 
W R W W R W W R W W R W W R G B R W W W W W W W W W W W W W 
R W W R W W R W W R W W R W G B W R W W W W W W W W W W W W 
W W R W W R W W R W W R W W G B W W R W W W W W W W W W W W 
W R W W R W W R W W R W W R G B W W W R W W W W W W W W W W 
R W W R W W R W W R W W R W G B W W W W R W W W W W W W W W 
W W R W W R W W R W W R W W G B W W W W W R W W W W W W W W 
W R W W R W W R W W R W W R G B W W W W W W R W W W W W W W 
R W W R W W R W W R W W R W G B W W W W W W W R W W W W W W 
W W R W W R W W R W W R W W G B W W W W W W W W R W W W W W 
W R W W R W W R W W R W W R G B W W W W W W W W W R W W W W 
R W W R W W R W W R W W R W G B W W W W W W W W W W R W W W 
W W R W W R W W R W W R W W G B W W W W W W W W W W W R W W 
W R W W R W W R W W R W W R G B W W W W W W W W W W W W R W 
R W W R W W R W W R W W R W G B W W W W W W W W W W W W W R 
              
                If your program is given a malformed BMP file, it should output
                Error!, followed by the debug representation of the
                error message.
                e.g. - consider the following error variation,
                where an invalid compression type is given:
              
6991 cargo run -- path/to/bad_compression.bmp
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/picasso ../../files.cp/bad_compression.bmp`
===== path/to/bad_compression.bmp =====
Error! BmpError { kind: UnsupportedCompressionType, details: "RLE 8-bit" }
              Multiple files should be seperated by equals and the filename, e.g.:
6991 cargo run -- path/to/bad_compression.bmp path/to/shreys_art.bmp
    Finished dev [unoptimized + debuginfo] target(s) in 0.44s
     Running `target/debug/picasso path/to/bad_compression.bmp path/to/shreys_art.bmp`
===== path/to/bad_compression.bmp =====
Error! BmpError { kind: UnsupportedCompressionType, details: "RLE 8-bit" }
===== path/to/shreys_art.bmp =====
R W W W W W W W W W W W W W B G W R W W R W W R W W R W W R 
W R W W W W W W W W W W W W B G R W W R W W R W W R W W R W 
W W R W W W W W W W W W W W B G W W R W W R W W R W W R W W 
W W W R W W W W W W W W W W B G W R W W R W W R W W R W W R 
W W W W R W W W W W W W W W B G R W W R W W R W W R W W R W 
W W W W W R W W W W W W W W B G W W R W W R W W R W W R W W 
W W W W W W R W W W W W W W B G W R W W R W W R W W R W W R 
W W W W W W W R W W W W W W B G R W W R W W R W W R W W R W 
W W W W W W W W R W W W W W B G W W R W W R W W R W W R W W 
W W W W W W W W W R W W W W B G W R W W R W W R W W R W W R 
W W W W W W W W W W R W W W B G R W W R W W R W W R W W R W 
W W W W W W W W W W W R W W B G W W R W W R W W R W W R W W 
W W W W W W W W W W W W R W B G W R W W R W W R W W R W W R 
W W W W W W W W W W W W W R B G R W W R W W R W W R W W R W 
G G G G G G G G G G G G G G B G B B B B B B B B B B B B B B 
B B B B B B B B B B B B B B G B G G G G G G G G G G G G G G 
W R W W R W W R W W R W W R G B R W W W W W W W W W W W W W 
R W W R W W R W W R W W R W G B W R W W W W W W W W W W W W 
W W R W W R W W R W W R W W G B W W R W W W W W W W W W W W 
W R W W R W W R W W R W W R G B W W W R W W W W W W W W W W 
R W W R W W R W W R W W R W G B W W W W R W W W W W W W W W 
W W R W W R W W R W W R W W G B W W W W W R W W W W W W W W 
W R W W R W W R W W R W W R G B W W W W W W R W W W W W W W 
R W W R W W R W W R W W R W G B W W W W W W W R W W W W W W 
W W R W W R W W R W W R W W G B W W W W W W W W R W W W W W 
W R W W R W W R W W R W W R G B W W W W W W W W W R W W W W 
R W W R W W R W W R W W R W G B W W W W W W W W W W R W W W 
W W R W W R W W R W W R W W G B W W W W W W W W W W W R W W 
W R W W R W W R W W R W W R G B W W W W W W W W W W W W R W 
R W W R W W R W W R W W R W G B W W W W W W W W W W W W W R 
              
              
                When you think your program is working, you can use
                autotest to run some simple automated tests:
              
6991 autotest
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
                  
                    Exercise:
                  
                  
Dealing with IO
                
              This program should ask for a name, accept it on the same line and then if a name is present, output the name!#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 100 int main(void) { printf("What is your name? "); // allocate some absurd amount of memory char name[100]; fgets(name, MAX_NAME_LEN, stdin); // trim the newline name[strcspn(name, "\n")] = 0; // if name is empty, print a message and exit if (name[0] == '\0') { printf("No name entered :(, goodbye.\n"); return 1; } else { printf("Hello, %s, nice to meet you!\n", name); } }
If no name is present (when the user hits "enter" on their keyboard) , it should output another message: "No name entered :(, goodbye.".
The program should behave the same, regardless of running in C or Rust
6991 cargo run Hello! What is your name: Shrey Hello, Shrey! Nice to meet you :)
6991 cargo run Hello! What is your name: You didn't enter a name!
                When you think your program is working, you can use
                autotest to run some simple automated tests:
              
6991 autotest
                When you are finished working on this exercise, you must submit
                your work by running give:
              
6991 give-crate
The recommended due date for this exercise is Week 2 Wednesday 21:00:00.
                You must run give before
                Week 10 Friday 17:00:00 to obtain the marks for
                this exercise. Note that this is an individual exercise; the
                work you submit with give must be entirely your
                own.
              
Submission
                When you are finished each exercise make sure you submit your
                work by running give.
              
You can run give multiple times.
Don't submit any exercises you haven't attempted.
If you are working at home, you may find it more convenient to upload your work via give's web interface.
The recommended due date for this week's exercises is Week 2 Wednesday 21:00:00.
You cannot obtain marks by e-mailing your code to tutors or lecturers.
                Automarking will be run continuously throughout the term, using
                test cases different to those autotest runs for
                you. (Hint: do your own testing as well as running
                autotest.)
              
After automarking is run you can view your results here or by running this command on a CSE machine:
6991 classrun -sturec