From 0357a23282f0a9848ba626bc3ea1ad63a030383c Mon Sep 17 00:00:00 2001 From: Exortions <75327059+Exortions@users.noreply.github.com> Date: Wed, 25 May 2022 20:07:53 -0700 Subject: [PATCH] merge: Add the Collatz Conjecture (#1022) * Create CollatzConjecture.js * Create CollatzConjecture.test.js * Update CollatzConjecture.js * Update CollatzConjecture.test.js * Rename CollatzConjecture.js to CollatzSequence.js * Update and rename CollatzConjecture.test.js to CollatzSequence.test.js * Update CollatzSequence.js * Update CollatzSequence.test.js * Update CollatzSequence.test.js * Fix styling errors * Add suggestion Co-authored-by: Rak Laptudirm * Update CollatzSequence.js * Update CollatzSequence.js * Update comments to match the Collatz Sequence * Update CollatzSequence.test.js Co-authored-by: Rak Laptudirm --- Maths/CollatzSequence.js | 30 ++++++++++++++++++++++++++++++ Maths/test/CollatzSequence.test.js | 8 ++++++++ 2 files changed, 38 insertions(+) create mode 100644 Maths/CollatzSequence.js create mode 100644 Maths/test/CollatzSequence.test.js diff --git a/Maths/CollatzSequence.js b/Maths/CollatzSequence.js new file mode 100644 index 000000000..d8ead61cc --- /dev/null +++ b/Maths/CollatzSequence.js @@ -0,0 +1,30 @@ +/** + * @function collatz + * @description Applies the Collatz Sequence on a specified number. + * The Collatz Sequence states that every natural number will always fall in a 1, 2, 4 loop when iterated under the following function: + * If the number is even, divide by 2, and if its odd, multiply it by 3 and add 1. + * + * @parama {Integer} n The number to apply the Collatz Sequence to. + * + * @return An array of steps and the final result.. + * + * @see [Collatz Conjecture](https://en.wikipedia.org/wiki/Collatz_conjecture) + * + * @example collatz(1) = { result: 1, steps: [] } + * @example collatz(5) = { result: 1, steps: [16, 8, 4, 2, 1] } +*/ +export function collatz (n) { + const steps = [] + + while (n !== 1) { + if (n % 2 === 0) { + n = n / 2 + } else { + n = 3 * n + 1 + } + + steps.push(n) + } + + return { result: n, steps: steps } +} diff --git a/Maths/test/CollatzSequence.test.js b/Maths/test/CollatzSequence.test.js new file mode 100644 index 000000000..f837bd90d --- /dev/null +++ b/Maths/test/CollatzSequence.test.js @@ -0,0 +1,8 @@ +import { collatz } from '../CollatzSequence' + +describe('The Collatz Sequence', () => { + it('Should be 1', () => { + expect(collatz(1)).toStrictEqual({ result: 1, steps: [] }) + expect(collatz(5)).toStrictEqual({ result: 1, steps: [16, 8, 4, 2, 1] }) + }) +})