Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding approach to Queen-Attack #2860

Merged
merged 20 commits into from
Nov 24, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
303523e
Adding approache to Queen-Attack
jagdish-15 Nov 9, 2024
80c4de0
Fixing style errors
jagdish-15 Nov 9, 2024
db87438
Fixing style errors
jagdish-15 Nov 9, 2024
e0f7eb5
Adding uuid for approach of queen-attack exercise
jagdish-15 Nov 14, 2024
2d683d8
Adding approache to Queen-Attack
jagdish-15 Nov 9, 2024
d19f7bf
Fixing style errors
jagdish-15 Nov 9, 2024
418ddb5
Fixing style errors
jagdish-15 Nov 9, 2024
c8acf18
Adding uuid for approach of queen-attack exercise
jagdish-15 Nov 14, 2024
dd94b36
Fixing minor issues
jagdish-15 Nov 15, 2024
3c4e52d
Merging with latest changes
jagdish-15 Nov 15, 2024
31ace8a
Fixing styling issues
jagdish-15 Nov 15, 2024
5885dc8
Chnaging the introduction.md for consistancy
jagdish-15 Nov 18, 2024
ddea7e4
Update exercises/practice/queen-attack/.approaches/introduction.md
jagdish-15 Nov 19, 2024
ec9e1e2
Update exercises/practice/queen-attack/.approaches/introduction.md
jagdish-15 Nov 19, 2024
a4d7438
Update exercises/practice/queen-attack/.approaches/simple-comparison/…
jagdish-15 Nov 19, 2024
d4f1b8e
Changing the name of the approach for queen-attack exercise and updat…
jagdish-15 Nov 19, 2024
3340b82
Updating introduction for approaches of queen-attack
jagdish-15 Nov 19, 2024
0715df7
Merge branch 'main' into add-approach-queen-attack
jagdish-15 Nov 23, 2024
7f4e980
Updating the approach for queen-attack after feedback
jagdish-15 Nov 23, 2024
b665c33
Merge branch 'add-approach-queen-attack' of https://github.com/jagdis…
jagdish-15 Nov 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions exercises/practice/queen-attack/.approaches/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"introduction": {
"authors": [
"jagdish-15"
]
},
"approaches": [
{
"uuid": "b2e474c8-b778-41e7-83c0-8e41cc84af9e",
"slug": "simple-comparison",
"title": "Simple Comparison Approach",
"blurb": "Use basic comparison checks to determine if queens can attack each other.",
"authors": [
"jagdish-15"
]
}
]
}
43 changes: 43 additions & 0 deletions exercises/practice/queen-attack/.approaches/introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Queen Attack Exercise
jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved

In this exercise, we determine if two queens on a chessboard can attack each other based on their positions.
A queen in chess can move any number of squares horizontally, vertically, or diagonally.
The task is to check if two queens, placed on specific coordinates, can attack each other.

## Genral Advice
jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved

The problem boils down to checking three conditions:

1. **Same Row**: If the queens are on the same row.
2. **Same Column**: If the queens are on the same column.
3. **Same Diagonal**: If the queens are on the same diagonal, i.e., the absolute difference between their row and column positions is equal.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
1. **Same Row**: If the queens are on the same row.
2. **Same Column**: If the queens are on the same column.
3. **Same Diagonal**: If the queens are on the same diagonal, i.e., the absolute difference between their row and column positions is equal.
1. **Same Row**: The queens are on the same row.
2. **Same Column**: The queens are on the same column.
3. **Same Diagonal**: The queens are on the same diagonal, i.e., the absolute difference between their row and column positions is equal.


## Approach: Simple Comparison Approach
jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved

```java
class QueenAttackCalculator {
private final Queen queen1;
private final Queen queen2;

QueenAttackCalculator(Queen queen1, Queen queen2) {
if (queen1 == null || queen2 == null) {
throw new IllegalArgumentException("You must supply valid positions for both Queens.");
}
if (queen1.getRow() == queen2.getRow() && queen1.getColumn() == queen2.getColumn()) {
throw new IllegalArgumentException("Queens cannot occupy the same position.");
}
this.queen1 = queen1;
this.queen2 = queen2;
}

boolean canQueensAttackOneAnother() {
int rowDifference = Math.abs(queen1.getRow() - queen2.getRow());
int columnDifference = Math.abs(queen1.getColumn() - queen2.getColumn());
return rowDifference == 0 || columnDifference == 0 || rowDifference == columnDifference;
}
}
```

For more details on the implementation of this approach, check out the [Simple Comparison Approach][simple-comparison-approach].

[simple-comparison-approach]: https://exercism.org/tracks/java/exercises/queen-attack/approaches/simple-comparison
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Queen Attack Approach

```java
class QueenAttackCalculator {
private final Queen queen1;
private final Queen queen2;

QueenAttackCalculator(Queen queen1, Queen queen2) {
if (queen1 == null || queen2 == null) {
throw new IllegalArgumentException("You must supply valid positions for both Queens.");
}
if (queen1.getRow() == queen2.getRow() && queen1.getColumn() == queen2.getColumn()) {
throw new IllegalArgumentException("Queens cannot occupy the same position.");
}
this.queen1 = queen1;
this.queen2 = queen2;
}

boolean canQueensAttackOneAnother() {
int rowDifference = Math.abs(queen1.getRow() - queen2.getRow());
int columnDifference = Math.abs(queen1.getColumn() - queen2.getColumn());
return rowDifference == 0 || columnDifference == 0 || rowDifference == columnDifference;
}
}
```

## Approach Steps

1. **Check if Queens are on the Same Row**:
- If both queens are on the same row, they can attack each other. This is checked by comparing their row values:

```java
if (queen1.getRow() == queen2.getRow()) {
return true;
}
jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved
```

2. **Check if Queens are on the Same Column**:
- If both queens are on the same column, they can attack each other. This is checked by comparing their column values:

```java
if (queen1.getColumn() == queen2.getColumn()) {
return true;
}
```

3. **Check if Queens are on the Same Diagonal**:
- If both queens are on the same diagonal, they can attack each other. This is checked by comparing the absolute difference between their row and column values:

```java
if (Math.abs(queen1.getRow() - queen2.getRow()) == Math.abs(queen1.getColumn() - queen2.getColumn())) {
return true;
}
```

4. **Return the Result**:
- If any of the above checks return `true`, the queens can attack each other. Otherwise, they cannot.

## Explanation

- **Row Check**: We first check if the queens are in the same row. If they are, they can attack each other.
- **Column Check**: Next, we check if the queens are in the same column. If they are, they can attack each other.
- **Diagonal Check**: Lastly, we check if the queens are positioned on the same diagonal. This is determined by comparing the absolute differences in their row and column positions.
- **Final Decision**: If any of these checks return `true`, the queens can attack each other. If none of these conditions are met, they cannot attack each other.

## Additional Explanation for Code

jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved
1. **Constructor**:

In the constructor of `QueenAttackCalculator`, we check if the queens are positioned at valid places.
jagdish-15 marked this conversation as resolved.
Show resolved Hide resolved
If either queen is `null`, or if both queens occupy the same position, an exception is thrown.
The constructor takes two `Queen` objects, `queen1` and `queen2`, and stores them as instance variables.

2. **Method (`canQueensAttackOneAnother`)**:

- This method computes the row and column differences between the two queens and then checks:
- If the row difference is zero (queens are on the same row).
- If the column difference is zero (queens are on the same column).
- If the row and column differences are equal (queens are on the same diagonal).
- If any of these checks are true, the method returns `true`, indicating that the queens can attack each other.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
boolean canQueensAttackOneAnother() {
int rowDifference = Math.abs(queen1.getRow() - queen2.getRow());
int columnDifference = Math.abs(queen1.getColumn() - queen2.getColumn());
return rowDifference == 0 || columnDifference == 0 || rowDifference == columnDifference;
}