From 45173e1e63d5b2a606c56edc7478b6855f642049 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Thu, 12 Sep 2024 01:34:22 -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 +++++++++++++++++++ .../hackerrank/warmup/diagonal_difference.hpp | 7 ++ .../hackerrank/warmup/diagonal_difference.cpp | 28 ++++++ .../warmup/diagonal_difference.test.cpp | 26 ++++++ .../warmup/diagonal_difference.testcases.json | 10 +++ 5 files changed, 157 insertions(+) create mode 100644 docs/hackerrank/warmup/diagonal_difference.md create mode 100644 src/lib/exercises/include/exercises/hackerrank/warmup/diagonal_difference.hpp create mode 100644 src/lib/exercises/src/hackerrank/warmup/diagonal_difference.cpp create mode 100644 src/tests/unit/lib/hackerrank/warmup/diagonal_difference.test.cpp create mode 100644 src/tests/unit/lib/hackerrank/warmup/diagonal_difference.testcases.json 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/lib/exercises/include/exercises/hackerrank/warmup/diagonal_difference.hpp b/src/lib/exercises/include/exercises/hackerrank/warmup/diagonal_difference.hpp new file mode 100644 index 0000000..8019cc7 --- /dev/null +++ b/src/lib/exercises/include/exercises/hackerrank/warmup/diagonal_difference.hpp @@ -0,0 +1,7 @@ +#include + +#pragma once + +namespace hackerrank::warmup { + int diagonalDifference(const std::vector>& arr); +} diff --git a/src/lib/exercises/src/hackerrank/warmup/diagonal_difference.cpp b/src/lib/exercises/src/hackerrank/warmup/diagonal_difference.cpp new file mode 100644 index 0000000..dc5d5db --- /dev/null +++ b/src/lib/exercises/src/hackerrank/warmup/diagonal_difference.cpp @@ -0,0 +1,28 @@ +#include + +/** + * @link Problem definition [[docs/hackerrank/warmup/diagonal_difference.md]] + */ + +#include +#include +#include +#include + +namespace hackerrank::warmup { + int diagonalDifference(const std::vector>& arr) { + int diag1 = 0; + int diag2 = 0; + size_t last = arr.size() - 1L; + + for (int i = 0; i < arr.size(); i++) { + for (int j = 0; j < arr[i].size(); j++) { + if (i == j) { + diag1 += arr[i][j]; + diag2 += arr[last - i][j]; + } + } + } + return abs(diag1 - diag2); + } +} diff --git a/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.test.cpp b/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.test.cpp new file mode 100644 index 0000000..ef29adb --- /dev/null +++ b/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.test.cpp @@ -0,0 +1,26 @@ +#include + +#include +#include +#include + +#include +#include +#include +using json = nlohmann::json; + +TEST_CASE("diagonalDifference JSON Test Cases", "[warmup]") +{ + std::filesystem::path cwd = std::filesystem::current_path(); + std::string path = cwd.string() + "/unit/lib/hackerrank/warmup/diagonal_difference.testcases.json"; + + INFO("diagonalDifference JSON test cases FILE: " << path); + + std::ifstream f(path); + json data = json::parse(f); + + for (auto testcase : data) { + long result = hackerrank::warmup::diagonalDifference(testcase["matrix"]); + CHECK(result == testcase["expected"]); + } +} diff --git a/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.testcases.json b/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.testcases.json new file mode 100644 index 0000000..ea2b143 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/warmup/diagonal_difference.testcases.json @@ -0,0 +1,10 @@ +[ + { "matrix": + [ + [11, 2, 4], + [4, 5, 6], + [10, 8, -12] + ], + "expected": 15 + } +]