From a3f1dc31241df0a9df65477760ee750e172a17d3 Mon Sep 17 00:00:00 2001 From: Gonzalo Diaz Date: Wed, 18 Sep 2024 23:00:22 -0300 Subject: [PATCH] =?UTF-8?q?[Hacker=20Rank]:=20Project=20Euler=20#2:=20Even?= =?UTF-8?q?=20Fibonacci=20numbers=20solved=20=E2=9C=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/hackerrank/projecteuler/euler002.md | 47 +++++++++++++++++++ .../hackerrank/projecteuler/euler002.hpp | 7 +++ .../src/hackerrank/projecteuler/euler002.cpp | 31 ++++++++++++ .../hackerrank/projecteuler/euler002.test.cpp | 28 +++++++++++ .../projecteuler/euler002.testcases.json | 4 ++ 5 files changed, 117 insertions(+) create mode 100644 docs/hackerrank/projecteuler/euler002.md create mode 100644 src/lib/exercises/include/exercises/hackerrank/projecteuler/euler002.hpp create mode 100644 src/lib/exercises/src/hackerrank/projecteuler/euler002.cpp create mode 100644 src/tests/unit/lib/hackerrank/projecteuler/euler002.test.cpp create mode 100644 src/tests/unit/lib/hackerrank/projecteuler/euler002.testcases.json diff --git a/docs/hackerrank/projecteuler/euler002.md b/docs/hackerrank/projecteuler/euler002.md new file mode 100644 index 0000000..27c7fb0 --- /dev/null +++ b/docs/hackerrank/projecteuler/euler002.md @@ -0,0 +1,47 @@ +# [Even Fibonacci numbers](https://www.hackerrank.com/contests/projecteuler/challenges/euler002) + +- Difficulty: #easy +- Category: #ProjectEuler+ + +Each new term in the Fibonacci sequence is generated by adding the previous two terms. +By starting with $ 1 $ and $ 2 $, the first $ 10 $ terms will be: + +$$ 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 $$ + +By considering the terms in the Fibonacci sequence whose values do not exceed +$ N $, find the sum of the even-valued terms. + +## Input Format + +First line contains $ T $ that denotes the number of test cases. This is +followed by $ T $ lines, each containing an integer, $ N $. + +## Constraints + +- $ 1 \leq T \leq 10^5 $ +- $ 10 \leq N \leq 4 × 10^{16} $ + +## Output Format + +Print the required answer for each test case. + +## Sample Input 0 + +```text +2 +10 +100 +``` + +## Sample Output 0 + +```text +10 +44 +``` + +## Explanation 0 + +- For $ N = 10 $, we have $ \{2, 8\} $, sum is $ 10 $. + +- For $ N = 100 $, we have $ \{2, 8, 34 \} $, sum is $ 44 $. diff --git a/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler002.hpp b/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler002.hpp new file mode 100644 index 0000000..c2ffc6f --- /dev/null +++ b/src/lib/exercises/include/exercises/hackerrank/projecteuler/euler002.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace hackerrank::projecteuler { + +int euler002(int n); + +} // namespace hackerrank::projecteuler diff --git a/src/lib/exercises/src/hackerrank/projecteuler/euler002.cpp b/src/lib/exercises/src/hackerrank/projecteuler/euler002.cpp new file mode 100644 index 0000000..06cbd4e --- /dev/null +++ b/src/lib/exercises/src/hackerrank/projecteuler/euler002.cpp @@ -0,0 +1,31 @@ +#include + +/** + * @link Problem definition [[docs/hackerrank/projecteuler/euler002.md]] + */ + +#include + +namespace hackerrank::projecteuler { + +int fibo_even_sum(int n) { + int fibo1 = 1; + int fibo2 = 1; + int total = 0; + + while (fibo1 + fibo2 < n) { + int fibo = fibo1 + fibo2; + fibo1 = fibo2; + fibo2 = fibo; + + if (fibo % 2 == 0) { + total += fibo; + } + } + + return total; +} + +int euler002(int n) { return fibo_even_sum(n); } + +} // namespace hackerrank::projecteuler diff --git a/src/tests/unit/lib/hackerrank/projecteuler/euler002.test.cpp b/src/tests/unit/lib/hackerrank/projecteuler/euler002.test.cpp new file mode 100644 index 0000000..42be835 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/projecteuler/euler002.test.cpp @@ -0,0 +1,28 @@ +#include + +#include +#include +#include + +#include +#include +#include +using json = nlohmann::json; + +TEST_CASE("euler002 JSON Test Cases", + "[hackerrank] [jsontestcase] [projecteuler]") { + std::filesystem::path cwd = std::filesystem::current_path(); + std::string path = + cwd.string() + + "/unit/lib/hackerrank/projecteuler/euler002.testcases.json"; + + INFO("euler002 JSON test cases FILE: " << path); + + std::ifstream f(path); + json data = json::parse(f); + + for (auto testcase : data) { + int result = hackerrank::projecteuler::euler002(testcase["n"]); + CHECK(result == testcase["expected"]); + } +} diff --git a/src/tests/unit/lib/hackerrank/projecteuler/euler002.testcases.json b/src/tests/unit/lib/hackerrank/projecteuler/euler002.testcases.json new file mode 100644 index 0000000..5af57f0 --- /dev/null +++ b/src/tests/unit/lib/hackerrank/projecteuler/euler002.testcases.json @@ -0,0 +1,4 @@ +[ + { "n": 10, "expected": 10 }, + { "n": 100, "expected": 44 } +]