Skip to content
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 $.
1 change: 1 addition & 0 deletions src/hackerrank/warmup/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ pub mod simple_array_sum;
pub mod compare_triplets;
pub mod a_very_big_sum;
pub mod diagonal_difference;
pub mod plus_minus;
31 changes: 31 additions & 0 deletions src/hackerrank/warmup/plus_minus.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// @link Problem definition [[docs/hackerrank/warmup/solveMeFirst.md]]

pub fn plus_minus_calculate(arr: &[i32]) -> (f64, f64, f64) {
let n = arr.len() as f64;
let (mut pos, mut neg, mut zero) = (0, 0, 0);

for &num in arr {
if num > 0 {
pos += 1;
} else if num < 0 {
neg += 1;
} else {
zero += 1;
}
}

(pos as f64 / n, neg as f64 / n, zero as f64 / n)
}

pub fn plus_minus_calculate_string(arr: &[i32]) -> (String, String, String) {
let (pos, neg, zero) = plus_minus_calculate(arr);
(format!("{:.6}", pos, ), format!("{:.6}", neg), format!("{:.6}", zero))
}

pub fn plus_minus(arr: &[i32]) {
let (pos, neg, zero) = plus_minus_calculate_string(arr);

println!("{}", pos);
println!("{}", neg);
println!("{}", zero);
}
7 changes: 7 additions & 0 deletions tests/data/hackerrank/warmup/plus_minus.testcases.json
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"]
}
]
1 change: 1 addition & 0 deletions tests/hackerrank/warmup/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ pub mod simple_array_sum;
pub mod compare_triplets;
pub mod a_very_big_sum;
pub mod diagonal_difference;
pub mod plus_minus;
39 changes: 39 additions & 0 deletions tests/hackerrank/warmup/plus_minus.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use serde::Deserialize;
use once_cell::sync::Lazy;

use exercises::hackerrank::warmup::plus_minus::plus_minus;
use exercises::hackerrank::warmup::plus_minus::plus_minus_calculate_string;
use crate::common::utils::load_json;

#[cfg(test)]
mod tests {
use super::*;

#[derive(Debug, Deserialize)]
struct PlusMinusTestCase {
title: String,
input: Vec<i32>,
expected: Vec<String>,
}

static TEST_DATA: Lazy<Vec<PlusMinusTestCase>> =
Lazy::new(|| load_json("tests/data/hackerrank/warmup/plus_minus.testcases.json"));

#[test]
fn test_plus_minus() {
for test_case in TEST_DATA.iter() {
println!("Testing hackerrank::warmup::plus_minus::plus_minus() : {:?}", test_case.title);

let expected: (_, _, _) = (
test_case.expected[0].clone(),
test_case.expected[1].clone(),
test_case.expected[2].clone()
);
let result = plus_minus_calculate_string(test_case.input.as_slice());
assert_eq!(result, expected);

// call printer for coverage
plus_minus(test_case.input.as_slice());
}
}
}
Loading