aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2021-01-04 13:59:27 +0000
committerFederico Igne <git@federicoigne.com>2021-11-03 18:55:08 +0000
commitfc1d4fbb98323b34829da9393f366fb07d2f1605 (patch)
tree4931923557f7976ba89f374b0c13cdf614b1984f
parentb296156206a9b1bc4473c163bff44e6f2bc95573 (diff)
downloadexercism-fc1d4fbb98323b34829da9393f366fb07d2f1605.tar.gz
exercism-fc1d4fbb98323b34829da9393f366fb07d2f1605.zip
[rust] Queen Attack
-rw-r--r--rust/queen-attack/.exercism/metadata.json1
-rw-r--r--rust/queen-attack/.gitignore8
-rw-r--r--rust/queen-attack/Cargo.toml4
-rw-r--r--rust/queen-attack/README.md107
-rw-r--r--rust/queen-attack/src/lib.rs36
-rw-r--r--rust/queen-attack/tests/queen-attack.rs78
6 files changed, 234 insertions, 0 deletions
diff --git a/rust/queen-attack/.exercism/metadata.json b/rust/queen-attack/.exercism/metadata.json
new file mode 100644
index 0000000..59f1f5d
--- /dev/null
+++ b/rust/queen-attack/.exercism/metadata.json
@@ -0,0 +1 @@
{"track":"rust","exercise":"queen-attack","id":"bc9fc8da81f74a1995df9013b5c78e49","url":"https://exercism.io/my/solutions/bc9fc8da81f74a1995df9013b5c78e49","handle":"dyamon","is_requester":true,"auto_approve":false} \ No newline at end of file
diff --git a/rust/queen-attack/.gitignore b/rust/queen-attack/.gitignore
new file mode 100644
index 0000000..db7f315
--- /dev/null
+++ b/rust/queen-attack/.gitignore
@@ -0,0 +1,8 @@
1# Generated by Cargo
2# will have compiled files and executables
3/target/
4**/*.rs.bk
5
6# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
7# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
8Cargo.lock
diff --git a/rust/queen-attack/Cargo.toml b/rust/queen-attack/Cargo.toml
new file mode 100644
index 0000000..ffb4cd8
--- /dev/null
+++ b/rust/queen-attack/Cargo.toml
@@ -0,0 +1,4 @@
1[package]
2edition = "2018"
3name = "queen-attack"
4version = "2.2.0"
diff --git a/rust/queen-attack/README.md b/rust/queen-attack/README.md
new file mode 100644
index 0000000..044e2cb
--- /dev/null
+++ b/rust/queen-attack/README.md
@@ -0,0 +1,107 @@
1# Queen Attack
2
3Given the position of two queens on a chess board, indicate whether or not they
4are positioned so that they can attack each other.
5
6In the game of chess, a queen can attack pieces which are on the same
7row, column, or diagonal.
8
9A chessboard can be represented by an 8 by 8 array.
10
11So if you're told the white queen is at (2, 3) and the black queen at
12(5, 6), then you'd know you've got a set-up like so:
13
14```text
15_ _ _ _ _ _ _ _
16_ _ _ _ _ _ _ _
17_ _ _ W _ _ _ _
18_ _ _ _ _ _ _ _
19_ _ _ _ _ _ _ _
20_ _ _ _ _ _ B _
21_ _ _ _ _ _ _ _
22_ _ _ _ _ _ _ _
23```
24
25You'd also be able to answer whether the queens can attack each other.
26In this case, that answer would be yes, they can, because both pieces
27share a diagonal.
28
29## Rust Installation
30
31Refer to the [exercism help page][help-page] for Rust installation and learning
32resources.
33
34## Writing the Code
35
36Execute the tests with:
37
38```bash
39$ cargo test
40```
41
42All but the first test have been ignored. After you get the first test to
43pass, open the tests source file which is located in the `tests` directory
44and remove the `#[ignore]` flag from the next test and get the tests to pass
45again. Each separate test is a function with `#[test]` flag above it.
46Continue, until you pass every test.
47
48If you wish to run all ignored tests without editing the tests source file, use:
49
50```bash
51$ cargo test -- --ignored
52```
53
54To run a specific test, for example `some_test`, you can use:
55
56```bash
57$ cargo test some_test
58```
59
60If the specific test is ignored use:
61
62```bash
63$ cargo test some_test -- --ignored
64```
65
66To learn more about Rust tests refer to the [online test documentation][rust-tests]
67
68Make sure to read the [Modules][modules] chapter if you
69haven't already, it will help you with organizing your files.
70
71## Further improvements
72
73After you have solved the exercise, please consider using the additional utilities, described in the [installation guide](https://exercism.io/tracks/rust/installation), to further refine your final solution.
74
75To format your solution, inside the solution directory use
76
77```bash
78cargo fmt
79```
80
81To see, if your solution contains some common ineffective use cases, inside the solution directory use
82
83```bash
84cargo clippy --all-targets
85```
86
87## Submitting the solution
88
89Generally you should submit all files in which you implemented your solution (`src/lib.rs` in most cases). If you are using any external crates, please consider submitting the `Cargo.toml` file. This will make the review process faster and clearer.
90
91## Feedback, Issues, Pull Requests
92
93The [exercism/rust](https://github.com/exercism/rust) repository on GitHub is the home for all of the Rust exercises. If you have feedback about an exercise, or want to help implement new exercises, head over there and create an issue. Members of the rust track team are happy to help!
94
95If you want to know more about Exercism, take a look at the [contribution guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md).
96
97[help-page]: https://exercism.io/tracks/rust/learning
98[modules]: https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html
99[cargo]: https://doc.rust-lang.org/book/ch14-00-more-about-cargo.html
100[rust-tests]: https://doc.rust-lang.org/book/ch11-02-running-tests.html
101
102## Source
103
104J Dalbey's Programming Practice problems [http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html](http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html)
105
106## Submitting Incomplete Solutions
107It's possible to submit an incomplete solution so you can see how others have completed the exercise.
diff --git a/rust/queen-attack/src/lib.rs b/rust/queen-attack/src/lib.rs
new file mode 100644
index 0000000..cbdc2c7
--- /dev/null
+++ b/rust/queen-attack/src/lib.rs
@@ -0,0 +1,36 @@
1#[derive(Debug)]
2pub struct ChessPosition {
3 rank: i32,
4 file: i32,
5}
6
7#[derive(Debug)]
8pub struct Queen {
9 pos: ChessPosition,
10}
11
12fn in_range<T: Ord>(n: T, min: T, max: T) -> bool {
13 min <= n && n < max
14}
15
16impl ChessPosition {
17 pub fn new(rank: i32, file: i32) -> Option<Self> {
18 if in_range(rank, 0, 8) && in_range(file, 0, 8) {
19 Some(ChessPosition { rank, file })
20 } else {
21 None
22 }
23 }
24}
25
26impl Queen {
27 pub fn new(pos: ChessPosition) -> Self {
28 Queen { pos }
29 }
30
31 pub fn can_attack(&self, other: &Queen) -> bool {
32 self.pos.file == other.pos.file
33 || self.pos.rank == other.pos.rank
34 || (self.pos.rank - other.pos.rank).abs() == (self.pos.file - other.pos.file).abs()
35 }
36}
diff --git a/rust/queen-attack/tests/queen-attack.rs b/rust/queen-attack/tests/queen-attack.rs
new file mode 100644
index 0000000..9eea61b
--- /dev/null
+++ b/rust/queen-attack/tests/queen-attack.rs
@@ -0,0 +1,78 @@
1use queen_attack::*;
2
3#[test]
4fn chess_position_on_the_board_is_some() {
5 assert!(ChessPosition::new(2, 4).is_some());
6}
7
8#[test]
9fn chess_position_off_the_board_is_none() {
10 assert!(ChessPosition::new(-1, 2).is_none());
11
12 assert!(ChessPosition::new(8, 2).is_none());
13
14 assert!(ChessPosition::new(5, -1).is_none());
15
16 assert!(ChessPosition::new(5, 8).is_none());
17}
18
19#[test]
20fn queen_is_created_with_a_valid_position() {
21 Queen::new(ChessPosition::new(2, 4).unwrap());
22}
23
24#[test]
25fn queens_that_can_not_attack() {
26 let white_queen = Queen::new(ChessPosition::new(2, 4).unwrap());
27 let black_queen = Queen::new(ChessPosition::new(6, 6).unwrap());
28
29 assert!(!white_queen.can_attack(&black_queen));
30}
31
32#[test]
33fn queens_on_the_same_rank_can_attack() {
34 let white_queen = Queen::new(ChessPosition::new(2, 4).unwrap());
35 let black_queen = Queen::new(ChessPosition::new(2, 6).unwrap());
36
37 assert!(white_queen.can_attack(&black_queen));
38}
39
40#[test]
41fn queens_on_the_same_file_can_attack() {
42 let white_queen = Queen::new(ChessPosition::new(4, 5).unwrap());
43 let black_queen = Queen::new(ChessPosition::new(3, 5).unwrap());
44
45 assert!(white_queen.can_attack(&black_queen));
46}
47
48#[test]
49fn queens_on_the_same_diagonal_can_attack_one() {
50 let white_queen = Queen::new(ChessPosition::new(2, 2).unwrap());
51 let black_queen = Queen::new(ChessPosition::new(0, 4).unwrap());
52
53 assert!(white_queen.can_attack(&black_queen));
54}
55
56#[test]
57fn queens_on_the_same_diagonal_can_attack_two() {
58 let white_queen = Queen::new(ChessPosition::new(2, 2).unwrap());
59 let black_queen = Queen::new(ChessPosition::new(3, 1).unwrap());
60
61 assert!(white_queen.can_attack(&black_queen));
62}
63
64#[test]
65fn queens_on_the_same_diagonal_can_attack_three() {
66 let white_queen = Queen::new(ChessPosition::new(2, 2).unwrap());
67 let black_queen = Queen::new(ChessPosition::new(1, 1).unwrap());
68
69 assert!(white_queen.can_attack(&black_queen));
70}
71
72#[test]
73fn queens_on_the_same_diagonal_can_attack_four() {
74 let white_queen = Queen::new(ChessPosition::new(2, 2).unwrap());
75 let black_queen = Queen::new(ChessPosition::new(5, 5).unwrap());
76
77 assert!(white_queen.can_attack(&black_queen));
78}