From 7690516566e5565ca73c87f3514ed8a155c20189 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 10 Sep 2025 19:38:19 -0300 Subject: [PATCH] =?UTF-8?q?[Hacker=20Rank]:=20Warmup:=20Diagonal=20Differe?= =?UTF-8?q?nce.=20Solved=20=E2=9C=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/hackerrank/warmup/diagonal_difference.md | 86 +++++++++++++++++++ src/hackerrank/warmup/diagonal_difference.rs | 19 ++++ src/hackerrank/warmup/mod.rs | 1 + .../warmup/diagonal_difference.testcases.json | 10 +++ .../hackerrank/warmup/diagonal_difference.rs | 31 +++++++ tests/hackerrank/warmup/mod.rs | 1 + 6 files changed, 148 insertions(+) create mode 100644 docs/hackerrank/warmup/diagonal_difference.md create mode 100644 src/hackerrank/warmup/diagonal_difference.rs create mode 100644 tests/data/hackerrank/warmup/diagonal_difference.testcases.json create mode 100644 tests/hackerrank/warmup/diagonal_difference.rs diff --git a/docs/hackerrank/warmup/diagonal_difference.md b/docs/hackerrank/warmup/diagonal_difference.md new file mode 100644 index 0000000..496e3a7 --- /dev/null +++ b/docs/hackerrank/warmup/diagonal_difference.md @@ -0,0 +1,86 @@ +# [Diagonal Difference](https://www.hackerrank.com/challenges/diagonal-difference) + +Difficulty: #easy +Category: #warmup + +Given a square matrix, calculate the absolute difference between the sums +of its diagonals. +For example, the square matrix $ arr $ is shown below: + +```text +1 2 3 +4 5 6 +9 8 9 +``` + +The left-to-right $ diagonal = 1 + 5 + 9 = 15 $. +The right to left $ diagonal = 3 + 5 + 9 = 17 $. +Their absolute difference is $ |15 - 17| = 2 $. + +## Function description + +Complete the $ diagonalDifference $ function in the editor below. +diagonalDifference takes the following parameter: + +- int ` arr[n][m] `: an array of integers + +## Return + +- int: the absolute diagonal difference + +## Input Format + +The first line contains a single integer, n, the number of +rows and columns in the square matrix arr. +Each of the next n lines describes a row, arr[i], and consists of +space-separated integers ` arr[i][j] `. + +## Constraints + +$ -100 \leq $ ` arr[i][j] ` $ \leq 100 $ + +## Output Format + +Return the absolute difference between the sums of the matrix's +two diagonals as a single integer. + +## Sample Input + +```text +3 +11 2 4 +4 5 6 +10 8 -12 +``` + +Sample Output + +```text +15 +``` + +## Explanation + +The primary diagonal is: + +```text +11 + 5 + -12 +``` + +Sum across the primary diagonal: 11 + 5 - 12 = 4 +The secondary diagonal is: + +```text + 4 + 5 +10 +``` + +Sum across the secondary diagonal: $ 4 + 5 + 10 = 19 $ +Difference: $ |4 - 19| = 15 $ + +*Note*: $ |x| $ is the +[absolute value](https://www.mathsisfun.com/numbers/absolute-value.html) +of $ x $ diff --git a/src/hackerrank/warmup/diagonal_difference.rs b/src/hackerrank/warmup/diagonal_difference.rs new file mode 100644 index 0000000..deb3e05 --- /dev/null +++ b/src/hackerrank/warmup/diagonal_difference.rs @@ -0,0 +1,19 @@ +// @link Problem definition [[docs/hackerrank/warmup/diagonal_difference.md]] + +pub fn diagonal_difference(arr: &[Vec]) -> i32 { + let mut diag1 = 0; + let mut diag2 = 0; + + let last = arr.len() - 1; + for (i, row) in arr.iter().enumerate() { + for(j, &value) in row.iter().enumerate() { + if i == j { + diag1 += value; + diag2 += arr[last - i][j]; + } + } + } + + (diag1 - diag2).abs() +} + diff --git a/src/hackerrank/warmup/mod.rs b/src/hackerrank/warmup/mod.rs index 2e5b07f..e73f9c1 100644 --- a/src/hackerrank/warmup/mod.rs +++ b/src/hackerrank/warmup/mod.rs @@ -2,3 +2,4 @@ pub mod solve_me_first; pub mod simple_array_sum; pub mod compare_triplets; pub mod a_very_big_sum; +pub mod diagonal_difference; diff --git a/tests/data/hackerrank/warmup/diagonal_difference.testcases.json b/tests/data/hackerrank/warmup/diagonal_difference.testcases.json new file mode 100644 index 0000000..ea2b143 --- /dev/null +++ b/tests/data/hackerrank/warmup/diagonal_difference.testcases.json @@ -0,0 +1,10 @@ +[ + { "matrix": + [ + [11, 2, 4], + [4, 5, 6], + [10, 8, -12] + ], + "expected": 15 + } +] diff --git a/tests/hackerrank/warmup/diagonal_difference.rs b/tests/hackerrank/warmup/diagonal_difference.rs new file mode 100644 index 0000000..185e134 --- /dev/null +++ b/tests/hackerrank/warmup/diagonal_difference.rs @@ -0,0 +1,31 @@ +use exercises::hackerrank::warmup::diagonal_difference::diagonal_difference; +use once_cell::sync::Lazy; +use serde::Deserialize; + +use crate::common; +use common::utils::load_json; + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Debug, Deserialize)] + struct DiagonalDifferenceTestCase { + matrix: Vec>, + expected: i32 + } + + static TEST_DATA: Lazy> = + Lazy::new(|| load_json("tests/data/hackerrank/warmup/diagonal_difference.testcases.json")); + + #[test] + fn test_diagonal_difference() { + println!("Testing hackerrank::warmup::diagonal_difference::diagonal_difference()"); + + for test_case in TEST_DATA.iter() { + let slice: &[Vec] = &test_case.matrix; + let result = diagonal_difference(slice); + assert_eq!(result, test_case.expected); + } + } +} diff --git a/tests/hackerrank/warmup/mod.rs b/tests/hackerrank/warmup/mod.rs index 2e5b07f..e73f9c1 100644 --- a/tests/hackerrank/warmup/mod.rs +++ b/tests/hackerrank/warmup/mod.rs @@ -2,3 +2,4 @@ pub mod solve_me_first; pub mod simple_array_sum; pub mod compare_triplets; pub mod a_very_big_sum; +pub mod diagonal_difference;