Skip to content

[Hacker Rank]: Warmup: Plus Minus. Solved ✅. #28

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

Merged
merged 1 commit into from
Sep 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
80 changes: 80 additions & 0 deletions docs/hackerrank/warmup/plus_minus.md
Original file line number Diff line number Diff line change
@@ -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 $.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <string>
#include <vector>
#pragma once

namespace hackerrank::warmup {
std::vector<std::string> plusMinusCalculate(const std::vector<int> &arr);
void plusMinus(const std::vector<int> &arr);
} // namespace hackerrank::warmup
62 changes: 62 additions & 0 deletions src/lib/exercises/src/hackerrank/warmup/plus_minus.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <exercises/hackerrank/warmup/plus_minus.hpp>

/**
* @link Problem definition [[docs/hackerrank/warmup/plus_minus.md]]
*/

#include <iostream>
#include <string>
#include <vector>

#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<std::string> plusMinusCalculate(const std::vector<int> &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<double> results = {
static_cast<double>(positives) / static_cast<double>(arr.size()),
static_cast<double>(negatives) / static_cast<double>(arr.size()),
static_cast<double>(zeros) / static_cast<double>(arr.size())};

std::vector<std::string> answer = {};

for (double tmp : results) {
std::string formatted = format_result(tmp);
answer.emplace_back(formatted);
}

return answer;
}

void plusMinus(const std::vector<int> &arr) {
std::vector<std::string> output = plusMinusCalculate(arr);

for (const std::string &line : output) {
std::cout << line << std::endl;
}
}
} // namespace hackerrank::warmup
29 changes: 29 additions & 0 deletions src/tests/unit/lib/hackerrank/warmup/plus_minus.test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include <catch2/catch_test_macros.hpp>

#include <exercises/hackerrank/warmup/plus_minus.hpp>
#include <iostream>
#include <stdexcept>
#include <vector>

#include <filesystem>
#include <fstream>
#include <nlohmann/json.hpp>
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<std::string> result =
hackerrank::warmup::plusMinusCalculate(testcase["input"]);
CHECK(result == testcase["expected"]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[
{
"title": "test case 0",
"input": [-4, 3, -9, 0, 4, 1],
"expected": ["0.500000", "0.333333", "0.166667"]
}
]