From d6ef608a0c398ae8b6456a6dbfbfe5b6fd2e7058 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Fri, 13 Sep 2024 18:45:51 -0300 Subject: [PATCH] =?UTF-8?q?[Hacker=20Rank]:=20Warmup:=20Plus=20Minus.=20So?= =?UTF-8?q?lved=20=E2=9C=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/hackerrank/warmup/plus_minus.md | 80 +++++++++++++++++++ .../hackerrank/warmup/plus_minus.hpp | 8 ++ .../src/hackerrank/warmup/plus_minus.cpp | 62 ++++++++++++++ .../lib/hackerrank/warmup/plus_minus.test.cpp | 29 +++++++ .../warmup/plus_minus.testcases.json | 7 ++ 5 files changed, 186 insertions(+) create mode 100644 docs/hackerrank/warmup/plus_minus.md create mode 100644 src/lib/exercises/include/exercises/hackerrank/warmup/plus_minus.hpp create mode 100644 src/lib/exercises/src/hackerrank/warmup/plus_minus.cpp create mode 100644 src/tests/unit/lib/hackerrank/warmup/plus_minus.test.cpp create mode 100644 src/tests/unit/lib/hackerrank/warmup/plus_minus.testcases.json diff --git a/docs/hackerrank/warmup/plus_minus.md b/docs/hackerrank/warmup/plus_minus.md new file mode 100644 index 0000000..ae601cd --- /dev/null +++ b/docs/hackerrank/warmup/plus_minus.md @@ -0,0 +1,80 @@ +# [Plus Minus](https://www.hackerrank.com/challenges/plus-minus) + +Difficulty: #easy +Category: #warmup + +Given an array of integers, calculate the ratios of its elements +that are positive, negative, and zero. Print the decimal value of +each fraction on a new line with 6 places after the decimal. + +**Note**: This challenge introduces precision problems. +The test cases are scaled to six decimal places, though answers +with absolute error of up to $ 10^{-4} $ are acceptable. + +## Example + +$ arr = [1, 1, 0, -1, -1] $ + +There are $ n = 5 $ elements, two positive, two negative and one zero. +Their ratios are $ 2/5 = 0.400000 $, $ 2/5 = 0.400000 $ and $ 1/5 = 0.200000 $. +Results are printed as: + +```text +0.400000 +0.400000 +0.200000 +``` + +## Function Description + +Complete the plusMinus function in the editor below. +plusMinus has the following parameter(s): + +- int arr[n]: an array of integers + +## Print + +Print the ratios of positive, negative and zero values in the array. +Each value should be printed on a separate line with $ 6 $ digits after +the decimal. The function should not return a value. + +## Input Format + +The first line contains an integer, `n`, the size of the array. +The second line contains `n` space-separated integers that describe `arr[n]`. + +## Constraints + +$ 0 < n \leq 100 $ \ +$ -100 \leq arr[i] \leq 100 $ + +## Output Format + +**Print** the following lines, each to decimals: + +1. proportion of positive values +2. proportion of negative values +3. proportion of zeros + +## Sample Input + +```text +STDIN Function +----- -------- +6 arr[] size n = 6 +-4 3 -9 0 4 1 arr = [-4, 3, -9, 0, 4, 1] +``` + +## Sample Output + +```text +0.500000 +0.333333 +0.166667 +``` + +## Explanation + +There are $ 3 $ positive numbers, negative numbers, and $ 1 $ zero in the array. +The proportions of occurrence are positive: $ 3/6 = 0.500000 $, +negative: $ 2/6 = 0.333333 $ and zeros: $ 1/6 = 0.166667 $. diff --git a/src/lib/exercises/include/exercises/hackerrank/warmup/plus_minus.hpp b/src/lib/exercises/include/exercises/hackerrank/warmup/plus_minus.hpp new file mode 100644 index 0000000..42adb61 --- /dev/null +++ b/src/lib/exercises/include/exercises/hackerrank/warmup/plus_minus.hpp @@ -0,0 +1,8 @@ +#include +#include +#pragma once + +namespace hackerrank::warmup { +std::vector plusMinusCalculate(const std::vector &arr); +void plusMinus(const std::vector &arr); +} // namespace hackerrank::warmup diff --git a/src/lib/exercises/src/hackerrank/warmup/plus_minus.cpp b/src/lib/exercises/src/hackerrank/warmup/plus_minus.cpp new file mode 100644 index 0000000..d172006 --- /dev/null +++ b/src/lib/exercises/src/hackerrank/warmup/plus_minus.cpp @@ -0,0 +1,62 @@ +#include + +/** + * @link Problem definition [[docs/hackerrank/warmup/plus_minus.md]] + */ + +#include +#include +#include + +#define BUFFER_MAX_SIZE 100 + +std::string format_result(double number) { + char buffer[BUFFER_MAX_SIZE]; + + snprintf(buffer, BUFFER_MAX_SIZE, "%0.6lf", number); + std::string formatted = buffer; + + return formatted; +} + +namespace hackerrank::warmup { +std::vector plusMinusCalculate(const std::vector &arr) { + unsigned long positives = 0; + int negatives = 0; + int zeros = 0; + + for (const int &value : arr) { + if (value > 0) { + positives += 1; + } + if (value < 0) { + negatives += 1; + } + if (value == 0) { + zeros += 1; + } + } + + std::vector results = { + static_cast(positives) / static_cast(arr.size()), + static_cast(negatives) / static_cast(arr.size()), + static_cast(zeros) / static_cast(arr.size())}; + + std::vector answer = {}; + + for (double tmp : results) { + std::string formatted = format_result(tmp); + answer.emplace_back(formatted); + } + + return answer; +} + +void plusMinus(const std::vector &arr) { + std::vector output = plusMinusCalculate(arr); + + for (const std::string &line : output) { + std::cout << line << std::endl; + } +} +} // namespace hackerrank::warmup diff --git a/src/tests/unit/lib/hackerrank/warmup/plus_minus.test.cpp b/src/tests/unit/lib/hackerrank/warmup/plus_minus.test.cpp new file mode 100644 index 0000000..a4eaed3 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/warmup/plus_minus.test.cpp @@ -0,0 +1,29 @@ +#include + +#include +#include +#include +#include + +#include +#include +#include +using json = nlohmann::json; + +TEST_CASE("plusMinus JSON Test Cases", "[warmup]") { + std::filesystem::path cwd = std::filesystem::current_path(); + std::string path = + cwd.string() + "/unit/lib/hackerrank/warmup/plus_minus.testcases.json"; + + INFO("plusMinus JSON test cases FILE: " << path); + + std::ifstream f(path); + json data = json::parse(f); + + for (auto testcase : data) { + hackerrank::warmup::plusMinus(testcase["input"]); + std::vector result = + hackerrank::warmup::plusMinusCalculate(testcase["input"]); + CHECK(result == testcase["expected"]); + } +} diff --git a/src/tests/unit/lib/hackerrank/warmup/plus_minus.testcases.json b/src/tests/unit/lib/hackerrank/warmup/plus_minus.testcases.json new file mode 100644 index 0000000..84bdf98 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/warmup/plus_minus.testcases.json @@ -0,0 +1,7 @@ +[ + { + "title": "test case 0", + "input": [-4, 3, -9, 0, 4, 1], + "expected": ["0.500000", "0.333333", "0.166667"] + } +]