diff --git a/recaman.cpp b/recaman.cpp new file mode 100644 index 0000000..7f9479e --- /dev/null +++ b/recaman.cpp @@ -0,0 +1,64 @@ +/* + * Compile with GCC using "g++ --std=c++23 recaman.cpp -o program"" + * + * SPDX-FileCopyrightText: Dora "cat" + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + if (argc != 2) { + std::print(std::cerr, "You must exclusively specify 1 argument as n (MUST " + "be uint64). Terminating.\n"); + return 1; + } + + uint64_t goalN = 0, currentN = 0; + try { + goalN = std::stoull(argv[1]); + } catch (std::exception e) { + std::print(std::cerr, "Error: could not convert {} to uint64. Aborting.\n", + argv[1]); + return 1; + } + + std::vector values(goalN); + int64_t expressionResult = 0; + + // Idea is that each Recaman's number is reliant on the number below it, so we + // can start from the bottom and generate to the top + while (goalN > currentN) { + if (currentN == 0) { + ++currentN; + continue; + } + + expressionResult = values[currentN - 1] - currentN; + if (expressionResult <= 0 || std::find(values.begin(), values.end(), + expressionResult) != values.end()) { + expressionResult += currentN * 2; + } + + values[currentN] = expressionResult; + ++currentN; + } + + // Once GCC fully implements C++23, I could do + // std::print("result: {}\n", values); + std::print("result:"); + for (uint64_t value : values) { + std::print(" {} ", value); + } + std::print("\n"); + return 0; +}